diff --git a/last_commit.txt b/last_commit.txt index cbf5df540b..8332f8fec4 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,98 +1,67 @@ -Repository: plone.dexterity +Repository: plone.app.z3cform Branch: refs/heads/master -Date: 2021-08-11T17:05:05+02:00 -Author: Jens W. Klein (jensens) -Commit: https://github.com/plone/plone.dexterity/commit/d6052b84a4331192e463abe5ed57d3a53016498b +Date: 2021-01-30T13:58:23-08:00 +Author: Alec Mitchell (alecpm) +Commit: https://github.com/plone/plone.app.z3cform/commit/aac89c6642739a72b4919c8dfa2a68e99a4197e0 -Black & Isort +Register converters to allow Select widgets to be used for RelationChoice and RelationList. Files changed: -A news/154.bugfix -M plone/__init__.py -M plone/dexterity/bbb.py -M plone/dexterity/behavior.py -M plone/dexterity/browser/add.py -M plone/dexterity/browser/base.py -M plone/dexterity/browser/edit.py -M plone/dexterity/browser/fti.py -M plone/dexterity/browser/traversal.py -M plone/dexterity/content.py -M plone/dexterity/events.py -M plone/dexterity/exportimport.py -M plone/dexterity/factory.py -M plone/dexterity/filerepresentation.py -M plone/dexterity/fti.py -M plone/dexterity/interfaces.py -M plone/dexterity/primary.py -M plone/dexterity/schema.py -M plone/dexterity/tests/case.py -M plone/dexterity/tests/schemata.py -M plone/dexterity/tests/test_behavior.py -M plone/dexterity/tests/test_content.py -M plone/dexterity/tests/test_content_integration.py -M plone/dexterity/tests/test_exportimport.py -M plone/dexterity/tests/test_factory.py -M plone/dexterity/tests/test_fti.py -M plone/dexterity/tests/test_primary.py -M plone/dexterity/tests/test_schema.py -M plone/dexterity/tests/test_schema_cache.py -M plone/dexterity/tests/test_security.py -M plone/dexterity/tests/test_utils.py -M plone/dexterity/tests/test_views.py -M plone/dexterity/tests/test_webdav.py -M plone/dexterity/utils.py - -b'diff --git a/news/154.bugfix b/news/154.bugfix\nnew file mode 100644\nindex 0000000..3e27c41\n--- /dev/null\n+++ b/news/154.bugfix\n@@ -0,0 +1 @@\n+Codestyle black and isort [jensens]\ndiff --git a/plone/__init__.py b/plone/__init__.py\nindex 68c04af..03d08ff 100644\n--- a/plone/__init__.py\n+++ b/plone/__init__.py\n@@ -1,2 +1,2 @@\n # -*- coding: utf-8 -*-\n-__import__(\'pkg_resources\').declare_namespace(__name__)\n+__import__("pkg_resources").declare_namespace(__name__)\ndiff --git a/plone/dexterity/bbb.py b/plone/dexterity/bbb.py\nindex d92c75f..9b3770e 100644\n--- a/plone/dexterity/bbb.py\n+++ b/plone/dexterity/bbb.py\n@@ -27,6 +27,7 @@ def dav__init(self, request, response):\n def dav__validate(self, object, methodname, REQUEST):\n pass\n \n- def dav__simpleifhandler(self, request, response, method=\'PUT\',\n- col=0, url=None, refresh=0):\n+ def dav__simpleifhandler(\n+ self, request, response, method="PUT", col=0, url=None, refresh=0\n+ ):\n pass\ndiff --git a/plone/dexterity/behavior.py b/plone/dexterity/behavior.py\nindex 35405a6..bf015f3 100644\n--- a/plone/dexterity/behavior.py\n+++ b/plone/dexterity/behavior.py\n@@ -9,8 +9,7 @@\n @implementer(IBehaviorAssignable)\n @adapter(IDexterityContent)\n class DexterityBehaviorAssignable(object):\n- """Support plone.behavior behaviors stored in the FTI\n- """\n+ """Support plone.behavior behaviors stored in the FTI"""\n \n def __init__(self, context):\n self.context = context\n@@ -22,7 +21,5 @@ def supports(self, behavior_interface):\n return False\n \n def enumerateBehaviors(self):\n- for behavior in SCHEMA_CACHE.behavior_registrations(\n- self.context.portal_type\n- ):\n+ for behavior in SCHEMA_CACHE.behavior_registrations(self.context.portal_type):\n yield behavior\ndiff --git a/plone/dexterity/browser/add.py b/plone/dexterity/browser/add.py\nindex 0c05d86..7308769 100644\n--- a/plone/dexterity/browser/add.py\n+++ b/plone/dexterity/browser/add.py\n@@ -44,7 +44,7 @@ def __init__(self, context, request, ti=None):\n if ti is not None:\n self.ti = ti\n self.portal_type = ti.getId()\n- self.request.form[\'disable_border\'] = True\n+ self.request.form["disable_border"] = True\n \n @property\n def additionalSchemata(self):\n@@ -71,7 +71,7 @@ def create(self, data):\n # to re-define a type through the web that uses the factory from an\n # existing type, but wants a unique portal_type!\n \n- if hasattr(content, \'_setPortalTypeName\'):\n+ if hasattr(content, "_setPortalTypeName"):\n content._setPortalTypeName(fti.getId())\n \n # Acquisition wrap temporarily to satisfy things like vocabularies\n@@ -107,7 +107,7 @@ def nextURL(self):\n \n # Buttons\n \n- @button.buttonAndHandler(_(\'Save\'), name=\'save\')\n+ @button.buttonAndHandler(_("Save"), name="save")\n def handleAdd(self, action):\n data, errors = self.extractData()\n if errors:\n@@ -117,11 +117,9 @@ def handleAdd(self, action):\n if obj is not None:\n # mark only as finished if we get the new object\n self._finishedAdd = True\n- IStatusMessage(self.request).addStatusMessage(\n- self.success_message, "info"\n- )\n+ IStatusMessage(self.request).addStatusMessage(self.success_message, "info")\n \n- @button.buttonAndHandler(_(u\'Cancel\'), name=\'cancel\')\n+ @button.buttonAndHandler(_(u"Cancel"), name="cancel")\n def handleCancel(self, action):\n IStatusMessage(self.request).addStatusMessage(\n _(u"Add New Item operation cancelled"), "info"\n@@ -131,11 +129,10 @@ def handleCancel(self, action):\n \n def update(self):\n if not IDeferSecurityCheck.providedBy(self.request):\n- allowed_ids = [fti.getId() for fti in\n- self.context.allowedContentTypes()]\n+ allowed_ids = [fti.getId() for fti in self.context.allowedContentTypes()]\n if self.portal_type not in allowed_ids:\n raise ValueError(\n- \'Subobject type disallowed by IConstrainTypes adapter: %s\'\n+ "Subobject type disallowed by IConstrainTypes adapter: %s"\n % self.portal_type\n )\n super(DefaultAddForm, self).update()\n@@ -145,10 +142,10 @@ def update(self):\n \n def updateActions(self):\n super(DefaultAddForm, self).updateActions()\n- if \'save\' in self.actions:\n+ if "save" in self.actions:\n self.actions["save"].addClass("context")\n \n- if \'cancel\' in self.actions:\n+ if "cancel" in self.actions:\n self.actions["cancel"].addClass("standalone")\n \n @property\n@@ -156,7 +153,7 @@ def label(self):\n portal_type = self.portal_type\n fti = getUtility(IDexterityFTI, name=portal_type)\n type_name = fti.Title()\n- return _(u"Add ${name}", mapping={\'name\': type_name})\n+ return _(u"Add ${name}", mapping={"name": type_name})\n \n \n class DefaultAddView(layout.FormWrapper, BrowserPage):\n@@ -175,8 +172,9 @@ def __init__(self, context, request, ti):\n self.ti = ti\n \n # Set portal_type name on newly created form instance\n- if self.form_instance is not None \\\n- and not getattr(self.form_instance, \'portal_type\', None):\n+ if self.form_instance is not None and not getattr(\n+ self.form_instance, "portal_type", None\n+ ):\n self.form_instance.portal_type = ti.getId()\n \n \ndiff --git a/plone/dexterity/browser/base.py b/plone/dexterity/browser/base.py\nindex c88ae48..581c96d 100644\n--- a/plone/dexterity/browser/base.py\n+++ b/plone/dexterity/browser/base.py\n@@ -7,10 +7,9 @@\n \n \n class DexterityExtensibleForm(AutoExtensibleForm):\n- """Mixin class for Dexterity forms that support updatable fields\n- """\n+ """Mixin class for Dexterity forms that support updatable fields"""\n \n- default_fieldset_label = _(\'label_schema_default\', default=u\'Default\')\n+ default_fieldset_label = _("label_schema_default", default=u"Default")\n \n @property\n def description(self):\n@@ -26,5 +25,4 @@ def schema(self):\n \n @property\n def additionalSchemata(self):\n- return getAdditionalSchemata(context=self.context,\n- portal_type=self.portal_type)\n+ return getAdditionalSchemata(context=self.context, portal_type=self.portal_type)\ndiff --git a/plone/dexterity/browser/edit.py b/plone/dexterity/browser/edit.py\nindex eb55971..e3edcf8 100644\n--- a/plone/dexterity/browser/edit.py\n+++ b/plone/dexterity/browser/edit.py\n@@ -21,36 +21,33 @@ class DefaultEditForm(DexterityExtensibleForm, form.EditForm):\n \n success_message = _(u"Changes saved")\n \n- @button.buttonAndHandler(_(u\'Save\'), name=\'save\')\n+ @button.buttonAndHandler(_(u"Save"), name="save")\n def handleApply(self, action):\n data, errors = self.extractData()\n if errors:\n self.status = self.formErrorsMessage\n return\n self.applyChanges(data)\n- IStatusMessage(self.request).addStatusMessage(\n- self.success_message, "info"\n- )\n+ IStatusMessage(self.request).addStatusMessage(self.success_message, "info")\n self.request.response.redirect(self.nextURL())\n notify(EditFinishedEvent(self.context))\n \n- @button.buttonAndHandler(_(u\'Cancel\'), name=\'cancel\')\n+ @button.buttonAndHandler(_(u"Cancel"), name="cancel")\n def handleCancel(self, action):\n- IStatusMessage(self.request).addStatusMessage(\n- _(u"Edit cancelled"), "info"\n- )\n+ IStatusMessage(self.request).addStatusMessage(_(u"Edit cancelled"), "info")\n self.request.response.redirect(self.nextURL())\n notify(EditCancelledEvent(self.context))\n \n def nextURL(self):\n view_url = self.context.absolute_url()\n- portal_type = getattr(self, \'portal_type\', None)\n+ portal_type = getattr(self, "portal_type", None)\n if portal_type is not None:\n registry = getUtility(IRegistry)\n use_view_action = registry.get(\n- \'plone.types_use_view_action_in_listings\', [])\n+ "plone.types_use_view_action_in_listings", []\n+ )\n if portal_type in use_view_action:\n- view_url = view_url + \'/view\'\n+ view_url = view_url + "/view"\n return view_url\n \n def update(self):\n@@ -64,10 +61,10 @@ def update(self):\n def updateActions(self):\n super(DefaultEditForm, self).updateActions()\n \n- if \'save\' in self.actions:\n+ if "save" in self.actions:\n self.actions["save"].addClass("context")\n \n- if \'cancel\' in self.actions:\n+ if "cancel" in self.actions:\n self.actions["cancel"].addClass("standalone")\n \n @property\n@@ -77,7 +74,8 @@ def fti(self):\n @property\n def label(self):\n type_name = self.fti.Title()\n- return _(u"Edit ${name}", mapping={\'name\': type_name})\n+ return _(u"Edit ${name}", mapping={"name": type_name})\n+\n \n DefaultEditView = layout.wrap_form(DefaultEditForm)\n classImplements(DefaultEditView, IDexterityEditForm)\ndiff --git a/plone/dexterity/browser/fti.py b/plone/dexterity/browser/fti.py\nindex a3844a1..72df006 100644\n--- a/plone/dexterity/browser/fti.py\n+++ b/plone/dexterity/browser/fti.py\n@@ -4,8 +4,7 @@\n \n \n class FTIAddView(FactoryTypeInformationAddView):\n- """Add view for the Dexterity FTI type\n- """\n+ """Add view for the Dexterity FTI type"""\n \n klass = DexterityFTI\n- description = u\'Factory Type Information for Dexterity Content Types\'\n+ description = u"Factory Type Information for Dexterity Content Types"\ndiff --git a/plone/dexterity/browser/traversal.py b/plone/dexterity/browser/traversal.py\nindex 719945a..0487ea5 100644\n--- a/plone/dexterity/browser/traversal.py\n+++ b/plone/dexterity/browser/traversal.py\n@@ -42,29 +42,32 @@ def publishTraverse(self, request, name):\n # If we are trying to traverse to the folder "body" pseudo-object\n # returned by listDAVObjects(), return that immediately\n \n- if getattr(request, \'maybe_webdav_client\', False) \\\n- and name == DAV_FOLDER_DATA_ID:\n- return FolderDataResource(\n- DAV_FOLDER_DATA_ID, context\n- ).__of__(context)\n+ if (\n+ getattr(request, "maybe_webdav_client", False)\n+ and name == DAV_FOLDER_DATA_ID\n+ ):\n+ return FolderDataResource(DAV_FOLDER_DATA_ID, context).__of__(context)\n \n- defaultTraversal = super(\n- DexterityPublishTraverse,\n- self).publishTraverse(request, name)\n+ defaultTraversal = super(DexterityPublishTraverse, self).publishTraverse(\n+ request, name\n+ )\n \n # If this is a WebDAV PUT/PROPFIND/PROPPATCH request, don\'t acquire\n # things. If we did, we couldn\'t create a new object with PUT, for\n # example, because the acquired object would shadow the NullResource\n \n- if getattr(request, \'maybe_webdav_client\', False) \\\n- and request.get(\'REQUEST_METHOD\', \'GET\') not in (\'GET\', \'POST\',) \\\n- and IAcquirer.providedBy(defaultTraversal):\n+ if (\n+ getattr(request, "maybe_webdav_client", False)\n+ and request.get("REQUEST_METHOD", "GET")\n+ not in (\n+ "GET",\n+ "POST",\n+ )\n+ and IAcquirer.providedBy(defaultTraversal)\n+ ):\n parent = aq_parent(aq_inner(defaultTraversal))\n if parent is not None and parent is not context:\n- return NullResource(\n- self.context,\n- name,\n- request).__of__(self.context)\n+ return NullResource(self.context, name, request).__of__(self.context)\n \n return defaultTraversal\n \n@@ -74,8 +77,12 @@ def browserDefault(self, request):\n # default view. The ZPublisher\'s WebDAV implementation doesn\'t\n # deal well with default views.\n \n- if getattr(request, \'maybe_webdav_client\', False) and \\\n- request.get(\'REQUEST_METHOD\', \'GET\') not in (\'GET\', \'POST\',):\n+ if getattr(request, "maybe_webdav_client", False) and request.get(\n+ "REQUEST_METHOD", "GET"\n+ ) not in (\n+ "GET",\n+ "POST",\n+ ):\n return self.context, ()\n \n return super(DexterityPublishTraverse, self).browserDefault(request)\ndiff --git a/plone/dexterity/content.py b/plone/dexterity/content.py\nindex 0bf92de..fa4b656 100644\n--- a/plone/dexterity/content.py\n+++ b/plone/dexterity/content.py\n@@ -61,34 +61,33 @@\n \n # see comment in DexterityContent.__getattr__ method\n ATTRIBUTE_NAMES_TO_IGNORE = (\n- \'_dav_writelocks\',\n- \'aq_inner\',\n- \'getCurrentSkinName\',\n- \'getURL\',\n- \'im_self\', # python 2 only, on python 3 it was renamed to __self__\n- \'plone_utils\',\n- \'portal_membership\',\n- \'portal_placeful_workflow\',\n- \'portal_properties\',\n- \'translation_service\',\n+ "_dav_writelocks",\n+ "aq_inner",\n+ "getCurrentSkinName",\n+ "getURL",\n+ "im_self", # python 2 only, on python 3 it was renamed to __self__\n+ "plone_utils",\n+ "portal_membership",\n+ "portal_placeful_workflow",\n+ "portal_properties",\n+ "translation_service",\n )\n \n-ASSIGNABLE_CACHE_KEY = \'__plone_dexterity_assignable_cache__\'\n+ASSIGNABLE_CACHE_KEY = "__plone_dexterity_assignable_cache__"\n \n \n def _default_from_schema(context, schema, fieldname):\n- """helper to lookup default value of a field\n- """\n+ """helper to lookup default value of a field"""\n if schema is None:\n return _marker\n field = schema.get(fieldname, None)\n if field is None:\n return _marker\n- default_factory = getattr(field, \'defaultFactory\', None)\n+ default_factory = getattr(field, "defaultFactory", None)\n if (\n # check for None to avoid one expensive providedBy (called often)\n- default_factory is not None and\n- IContextAwareDefaultFactory.providedBy(default_factory)\n+ default_factory is not None\n+ and IContextAwareDefaultFactory.providedBy(default_factory)\n ):\n return deepcopy(field.bind(context).default)\n return deepcopy(field.default)\n@@ -104,7 +103,7 @@ def get_assignable(context):\n request = getRequest()\n if not request:\n return IBehaviorAssignable(context, None)\n- cache_key = getattr(context, \'_p_oid\', None)\n+ cache_key = getattr(context, "_p_oid", None)\n if not cache_key:\n return IBehaviorAssignable(context, None)\n assignable_cache = getattr(request, ASSIGNABLE_CACHE_KEY, _marker)\n@@ -131,10 +130,10 @@ def __get__(self, inst, cls=None):\n return getObjectSpecification(cls)\n \n # get direct specification\n- spec = getattr(inst, \'__provides__\', None)\n+ spec = getattr(inst, "__provides__", None)\n \n # avoid recursion - fall back on default\n- if getattr(_recursion_detection, \'blocked\', False):\n+ if getattr(_recursion_detection, "blocked", False):\n return spec\n \n # If the instance doesn\'t have a __provides__ attribute, get the\n@@ -143,7 +142,7 @@ def __get__(self, inst, cls=None):\n spec = implementedBy(cls)\n \n # Find the data we need to know if our cache needs to be invalidated\n- portal_type = getattr(inst, \'portal_type\', None)\n+ portal_type = getattr(inst, "portal_type", None)\n \n # If the instance has no portal type, then we\'re done.\n if portal_type is None:\n@@ -151,7 +150,7 @@ def __get__(self, inst, cls=None):\n \n # Find the cached value. This calculation is expensive and called\n # hundreds of times during each request, so we require a fast cache\n- cache = getattr(inst, \'_v__providedBy__\', None)\n+ cache = getattr(inst, "_v__providedBy__", None)\n \n # See if we have a current cache. Reasons to do this include:\n #\n@@ -162,7 +161,7 @@ def __get__(self, inst, cls=None):\n inst._p_mtime,\n SCHEMA_CACHE.modified(portal_type),\n SCHEMA_CACHE.invalidations,\n- hash(spec)\n+ hash(spec),\n )\n if cache is not None and cache[:-1] == updated:\n if cache[-1] is not None:\n@@ -176,26 +175,24 @@ def __get__(self, inst, cls=None):\n dynamically_provided = []\n \n # block recursion\n- setattr(_recursion_detection, \'blocked\', True)\n+ setattr(_recursion_detection, "blocked", True)\n try:\n assignable = get_assignable(inst)\n if assignable is not None:\n for behavior_registration in assignable.enumerateBehaviors():\n if behavior_registration.marker:\n- dynamically_provided.append(\n- behavior_registration.marker\n- )\n+ dynamically_provided.append(behavior_registration.marker)\n finally:\n- setattr(_recursion_detection, \'blocked\', False)\n+ setattr(_recursion_detection, "blocked", False)\n \n if not dynamically_provided:\n # rare case if no schema nor behaviors with markers are set\n- inst._v__providedBy__ = updated + (None, )\n+ inst._v__providedBy__ = updated + (None,)\n return spec\n \n dynamically_provided.append(spec)\n all_spec = Implements(*dynamically_provided)\n- inst._v__providedBy__ = updated + (all_spec, )\n+ inst._v__providedBy__ = updated + (all_spec,)\n \n return all_spec\n \n@@ -208,7 +205,7 @@ class AttributeValidator(Explicit):\n \n def __call__(self, name, value):\n # Short circuit for things like views or viewlets\n- if name == \'\':\n+ if name == "":\n return 1\n \n context = aq_parent(self)\n@@ -218,8 +215,7 @@ def __call__(self, name, value):\n # decides to have behaviors bound on something different than context\n # or fti, i.e. schemas for subtrees.\n protection_dict = all_merged_tagged_values_dict(\n- iterSchemata(context),\n- READ_PERMISSIONS_KEY\n+ iterSchemata(context), READ_PERMISSIONS_KEY\n )\n \n if name not in protection_dict:\n@@ -227,15 +223,12 @@ def __call__(self, name, value):\n \n permission = queryUtility(IPermission, name=protection_dict[name])\n if permission is not None:\n- return getSecurityManager().checkPermission(\n- permission.title, context\n- )\n+ return getSecurityManager().checkPermission(permission.title, context)\n \n return 0\n \n \n class PasteBehaviourMixin(object):\n-\n def _notifyOfCopyTo(self, container, op=0):\n """Keep Archetypes\' reference info internally when op == 1 (move)\n because in those cases we need to keep Archetypes\' refeferences.\n@@ -274,13 +267,11 @@ def _verifyObjectPaste(self, obj, validate_src=True):\n # allowed.\n super(PasteBehaviourMixin, self)._verifyObjectPaste(obj, validate_src)\n if validate_src:\n- portal_type = getattr(aq_base(obj), \'portal_type\', None)\n+ portal_type = getattr(aq_base(obj), "portal_type", None)\n if portal_type:\n fti = queryUtility(ITypeInformation, name=portal_type)\n if fti is not None and not fti.isConstructionAllowed(self):\n- raise ValueError(\n- \'You can not add the copied content here.\'\n- )\n+ raise ValueError("You can not add the copied content here.")\n \n def _getCopy(self, container):\n # Copy the _v_is_cp and _v_cp_refs flags from the original\n@@ -289,13 +280,13 @@ def _getCopy(self, container):\n # When the flags are missing, an Archetypes child object will not have\n # the UID updated in some situations.\n # Copied from Products.Archetypes.Referenceable.Referenceable._getCopy\n- is_cp_flag = getattr(self, \'_v_is_cp\', None)\n- cp_refs_flag = getattr(self, \'_v_cp_refs\', None)\n+ is_cp_flag = getattr(self, "_v_is_cp", None)\n+ cp_refs_flag = getattr(self, "_v_cp_refs", None)\n ob = super(PasteBehaviourMixin, self)._getCopy(container)\n if is_cp_flag:\n- setattr(ob, \'_v_is_cp\', is_cp_flag)\n+ setattr(ob, "_v_is_cp", is_cp_flag)\n if cp_refs_flag:\n- setattr(ob, \'_v_cp_refs\', cp_refs_flag)\n+ setattr(ob, "_v_cp_refs", cp_refs_flag)\n return ob\n \n \n@@ -305,12 +296,10 @@ def _getCopy(self, container):\n IAttributeUUID,\n IDublinCore,\n ICatalogableDublinCore,\n- IMutableDublinCore\n+ IMutableDublinCore,\n )\n-class DexterityContent(DAVResourceMixin, PortalContent, PropertyManager,\n- Contained):\n- """Base class for Dexterity content\n- """\n+class DexterityContent(DAVResourceMixin, PortalContent, PropertyManager, Contained):\n+ """Base class for Dexterity content"""\n \n __providedBy__ = FTIAwareSpecification()\n __allow_access_to_unprotected_subobjects__ = AttributeValidator()\n@@ -320,23 +309,31 @@ class DexterityContent(DAVResourceMixin, PortalContent, PropertyManager,\n # portal_type is set by the add view and/or factory\n portal_type = None\n \n- title = u\'\'\n- description = u\'\'\n+ title = u""\n+ description = u""\n subject = ()\n creators = ()\n contributors = ()\n effective_date = None\n expiration_date = None\n- format = \'text/html\'\n- language = \'\'\n- rights = \'\'\n+ format = "text/html"\n+ language = ""\n+ rights = ""\n \n def __init__(\n- self,\n- id=None, title=_marker, subject=_marker, description=_marker,\n- contributors=_marker, effective_date=_marker,\n- expiration_date=_marker, format=_marker, language=_marker,\n- rights=_marker, **kwargs):\n+ self,\n+ id=None,\n+ title=_marker,\n+ subject=_marker,\n+ description=_marker,\n+ contributors=_marker,\n+ effective_date=_marker,\n+ expiration_date=_marker,\n+ format=_marker,\n+ language=_marker,\n+ rights=_marker,\n+ **kwargs\n+ ):\n \n if id is not None:\n self.id = id\n@@ -378,20 +375,16 @@ def __getattr__(self, name):\n # Ignore also some other well known names like\n # Permission, Acquisition and AccessControl related ones.\n if (\n- name.startswith(\'__\')\n- or name.startswith(\'_v\')\n- or name.endswith(\'_Permission\')\n+ name.startswith("__")\n+ or name.startswith("_v")\n+ or name.endswith("_Permission")\n or name in ATTRIBUTE_NAMES_TO_IGNORE\n ):\n raise AttributeError(name)\n \n # attribute was not found; try to look it up in the schema and return\n # a default\n- value = _default_from_schema(\n- self,\n- SCHEMA_CACHE.get(self.portal_type),\n- name\n- )\n+ value = _default_from_schema(self, SCHEMA_CACHE.get(self.portal_type), name)\n if value is not _marker:\n return value\n \n@@ -401,9 +394,7 @@ def __getattr__(self, name):\n for behavior_registration in assignable.enumerateBehaviors():\n if behavior_registration.interface:\n value = _default_from_schema(\n- self,\n- behavior_registration.interface,\n- name\n+ self, behavior_registration.interface, name\n )\n if value is not _marker:\n return value\n@@ -451,7 +442,7 @@ def addCreator(self, creator=None):\n \n # call self.listCreators() to make sure self.creators exists\n if creator and creator not in self.listCreators():\n- self.creators = self.creators + (creator, )\n+ self.creators = self.creators + (creator,)\n \n @security.protected(permissions.ModifyPortalContent)\n def setModificationDate(self, modification_date=None):\n@@ -468,29 +459,29 @@ def setModificationDate(self, modification_date=None):\n def Title(self):\n # this is a CMF accessor, so should return utf8-encoded\n if six.PY2 and isinstance(self.title, six.text_type):\n- return self.title.encode(\'utf-8\')\n- return self.title or \'\'\n+ return self.title.encode("utf-8")\n+ return self.title or ""\n \n @security.protected(permissions.View)\n def Description(self):\n- value = self.description or \'\'\n+ value = self.description or ""\n \n # If description is containing linefeeds the HTML\n # validation can break.\n # See http://bo.geekworld.dk/diazo-bug-on-html5-validation-errors/\n # Remember: \\r\\n - Windows, \\r - OS X, \\n - Linux/Unix\n- value = value.replace(\'\\r\\n\', \' \').replace(\'\\r\', \' \').replace(\'\\n\', \' \') # noqa\n+ value = value.replace("\\r\\n", " ").replace("\\r", " ").replace("\\n", " ") # noqa\n \n # this is a CMF accessor, so should return utf8-encoded\n if six.PY2 and isinstance(value, six.text_type):\n- value = value.encode(\'utf-8\')\n+ value = value.encode("utf-8")\n \n return value\n \n @security.protected(permissions.View)\n def Type(self):\n ti = self.getTypeInfo()\n- return ti is not None and ti.Title() or \'Unknown\'\n+ return ti is not None and ti.Title() or "Unknown"\n \n # IDublinCore\n \n@@ -507,7 +498,7 @@ def listCreators(self):\n def Creator(self):\n # Dublin Core Creator element - resource author.\n creators = self.listCreators()\n- return creators and creators[0] or \'\'\n+ return creators and creators[0] or ""\n \n @security.protected(permissions.View)\n def Subject(self):\n@@ -521,7 +512,7 @@ def Subject(self):\n @security.protected(permissions.View)\n def Publisher(self):\n # Dublin Core Publisher element - resource publisher.\n- return \'No publisher\'\n+ return "No publisher"\n \n @security.protected(permissions.View)\n def listContributors(self):\n@@ -541,7 +532,7 @@ def Date(self, zone=None):\n if zone is None:\n zone = _zone\n # Return effective_date if set, modification date otherwise\n- date = getattr(self, \'effective_date\', None)\n+ date = getattr(self, "effective_date", None)\n if date is None:\n date = self.modified()\n \n@@ -558,25 +549,25 @@ def CreationDate(self, zone=None):\n date = datify(self.creation_date)\n return date.toZone(zone).ISO()\n else:\n- return \'Unknown\'\n+ return "Unknown"\n \n @security.protected(permissions.View)\n def EffectiveDate(self, zone=None):\n # Dublin Core Date element - date resource becomes effective.\n if zone is None:\n zone = _zone\n- ed = getattr(self, \'effective_date\', None)\n+ ed = getattr(self, "effective_date", None)\n ed = datify(ed)\n- return ed and ed.toZone(zone).ISO() or \'None\'\n+ return ed and ed.toZone(zone).ISO() or "None"\n \n @security.protected(permissions.View)\n def ExpirationDate(self, zone=None):\n # Dublin Core Date element - date resource expires.\n if zone is None:\n zone = _zone\n- ed = getattr(self, \'expiration_date\', None)\n+ ed = getattr(self, "expiration_date", None)\n ed = datify(ed)\n- return ed and ed.toZone(zone).ISO() or \'None\'\n+ return ed and ed.toZone(zone).ISO() or "None"\n \n @security.protected(permissions.View)\n def ModificationDate(self, zone=None):\n@@ -609,23 +600,23 @@ def Rights(self):\n def created(self):\n # Dublin Core Date element - date resource created.\n # allow for non-existent creation_date, existed always\n- date = getattr(self, \'creation_date\', None)\n+ date = getattr(self, "creation_date", None)\n date = datify(date)\n return date is None and FLOOR_DATE or date\n \n @security.protected(permissions.View)\n def effective(self):\n # Dublin Core Date element - date resource becomes effective.\n- date = getattr(self, \'effective_date\', _marker)\n+ date = getattr(self, "effective_date", _marker)\n if date is _marker:\n- date = getattr(self, \'creation_date\', None)\n+ date = getattr(self, "creation_date", None)\n date = datify(date)\n return date is None and FLOOR_DATE or date\n \n @security.protected(permissions.View)\n def expires(self):\n # Dublin Core Date element - date resource expires.\n- date = getattr(self, \'expiration_date\', None)\n+ date = getattr(self, "expiration_date", None)\n date = datify(date)\n return date is None and CEILING_DATE or date\n \n@@ -643,10 +634,8 @@ def modified(self):\n @security.protected(permissions.View)\n def isEffective(self, date):\n # Is the date within the resource\'s effective range?\n- pastEffective = (\n- self.effective_date is None or self.effective_date <= date)\n- beforeExpiration = (\n- self.expiration_date is None or self.expiration_date >= date)\n+ pastEffective = self.effective_date is None or self.effective_date <= date\n+ beforeExpiration = self.expiration_date is None or self.expiration_date >= date\n return pastEffective and beforeExpiration\n \n # IMutableDublinCore\n@@ -679,9 +668,8 @@ def setSubject(self, subject):\n def setContributors(self, contributors):\n # Set Dublin Core Contributor elements - resource collaborators.\n if isinstance(contributors, six.string_types):\n- contributors = contributors.split(\';\')\n- self.contributors = tuple(\n- safe_unicode(c.strip()) for c in contributors)\n+ contributors = contributors.split(";")\n+ self.contributors = tuple(safe_unicode(c.strip()) for c in contributors)\n \n @security.protected(permissions.ModifyPortalContent)\n def setEffectiveDate(self, effective_date):\n@@ -711,18 +699,24 @@ def setRights(self, rights):\n \n @implementer(IDexterityItem)\n class Item(PasteBehaviourMixin, BrowserDefaultMixin, DexterityContent):\n- """A non-containerish, CMFish item\n- """\n+ """A non-containerish, CMFish item"""\n \n __providedBy__ = FTIAwareSpecification()\n __allow_access_to_unprotected_subobjects__ = AttributeValidator()\n \n isPrincipiaFolderish = 0\n \n- manage_options = PropertyManager.manage_options + ({\n- \'label\': \'View\',\n- \'action\': \'view\',\n- },) + CMFCatalogAware.manage_options + SimpleItem.manage_options\n+ manage_options = (\n+ PropertyManager.manage_options\n+ + (\n+ {\n+ "label": "View",\n+ "action": "view",\n+ },\n+ )\n+ + CMFCatalogAware.manage_options\n+ + SimpleItem.manage_options\n+ )\n \n # Be explicit about which __getattr__ to use\n __getattr__ = DexterityContent.__getattr__\n@@ -730,26 +724,25 @@ class Item(PasteBehaviourMixin, BrowserDefaultMixin, DexterityContent):\n \n @implementer(IDexterityContainer)\n class Container(\n- PathReprProvider,\n- PasteBehaviourMixin, DAVCollectionMixin, BrowserDefaultMixin,\n- CMFCatalogAware, CMFOrderedBTreeFolderBase, DexterityContent):\n- """Base class for folderish items\n- """\n+ PathReprProvider,\n+ PasteBehaviourMixin,\n+ DAVCollectionMixin,\n+ BrowserDefaultMixin,\n+ CMFCatalogAware,\n+ CMFOrderedBTreeFolderBase,\n+ DexterityContent,\n+):\n+ """Base class for folderish items"""\n \n __providedBy__ = FTIAwareSpecification()\n __allow_access_to_unprotected_subobjects__ = AttributeValidator()\n \n security = ClassSecurityInfo()\n- security.declareProtected(\n- acpermissions.copy_or_move, \'manage_copyObjects\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_cutObjects\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_pasteObjects\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_renameObject\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_renameObjects\')\n+ security.declareProtected(acpermissions.copy_or_move, "manage_copyObjects")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_cutObjects")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_pasteObjects")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_renameObject")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_renameObjects")\n \n isPrincipiaFolderish = 1\n \n@@ -789,12 +782,9 @@ def manage_delObjects(self, ids=None, REQUEST=None):\n for id in ids:\n item = self._getOb(id)\n if not getSecurityManager().checkPermission(\n- permissions.DeleteObjects,\n- item\n+ permissions.DeleteObjects, item\n ):\n- raise Unauthorized(\n- "Do not have permissions to remove this object"\n- )\n+ raise Unauthorized("Do not have permissions to remove this object")\n return super(Container, self).manage_delObjects(ids, REQUEST=REQUEST)\n \n # override PortalFolder\'s allowedContentTypes to respect IConstrainTypes\n@@ -820,12 +810,12 @@ def invokeFactory(self, type_name, id, RESPONSE=None, *args, **kw):\n # an Unauthorized over a ValueError.\n fti = queryUtility(ITypeInformation, name=type_name)\n if fti is not None and not fti.isConstructionAllowed(self):\n- raise Unauthorized(\'Cannot create %s\' % fti.getId())\n+ raise Unauthorized("Cannot create %s" % fti.getId())\n \n allowed_ids = [i.getId() for i in constrains.allowedContentTypes()]\n if type_name not in allowed_ids:\n raise ValueError(\n- \'Subobject type disallowed by IConstrainTypes adapter: %s\'\n+ "Subobject type disallowed by IConstrainTypes adapter: %s"\n % type_name\n )\n \n@@ -835,8 +825,7 @@ def invokeFactory(self, type_name, id, RESPONSE=None, *args, **kw):\n \n \n def reindexOnModify(content, event):\n- """When an object is modified, re-index it in the catalog\n- """\n+ """When an object is modified, re-index it in the catalog"""\n \n if event.object is not content:\n return\ndiff --git a/plone/dexterity/events.py b/plone/dexterity/events.py\nindex 4bee910..81e08bd 100644\n--- a/plone/dexterity/events.py\n+++ b/plone/dexterity/events.py\n@@ -1,13 +1,12 @@\n # -*- coding: utf-8 -*-\n from plone.dexterity import interfaces\n-from zope.interface.interfaces import ObjectEvent\n from zope.interface import implementer\n+from zope.interface.interfaces import ObjectEvent\n \n \n @implementer(interfaces.IEditBegunEvent)\n class EditBegunEvent(ObjectEvent):\n- """An edit operation was begun\n- """\n+ """An edit operation was begun"""\n \n \n @implementer(interfaces.IAddBegunEvent)\n@@ -19,8 +18,7 @@ class AddBegunEvent(ObjectEvent):\n \n @implementer(interfaces.IEditCancelledEvent)\n class EditCancelledEvent(ObjectEvent):\n- """An edit operation was cancelled\n- """\n+ """An edit operation was cancelled"""\n \n \n @implementer(interfaces.IAddCancelledEvent)\ndiff --git a/plone/dexterity/exportimport.py b/plone/dexterity/exportimport.py\nindex 591f825..ee39472 100644\n--- a/plone/dexterity/exportimport.py\n+++ b/plone/dexterity/exportimport.py\n@@ -19,7 +19,7 @@\n \n @implementer(IFilesystemExporter, IFilesystemImporter)\n class DexterityContentExporterImporter(FolderishExporterImporter):\n- """ Tree-walking exporter / importer for Dexterity types.\n+ """Tree-walking exporter / importer for Dexterity types.\n \n This is based on the generic one in GenericSetup,\n but it uses Dexterity\'s rfc822 serialization support\n@@ -43,12 +43,11 @@ def __init__(self, context):\n self.context = context\n \n def export(self, export_context, subdir, root=False):\n- """ See IFilesystemExporter.\n- """\n+ """See IFilesystemExporter."""\n context = self.context\n \n if not root:\n- subdir = \'%s/%s\' % (subdir, context.getId())\n+ subdir = "%s/%s" % (subdir, context.getId())\n \n exportable = self.listExportableItems()\n \n@@ -66,19 +65,19 @@ def export(self, export_context, subdir, root=False):\n csv_writer.writerow((object_id, factory_name))\n \n export_context.writeDataFile(\n- \'.objects\',\n+ ".objects",\n text=stream.getvalue(),\n- content_type=\'text/comma-separated-values\',\n+ content_type="text/comma-separated-values",\n subdir=subdir,\n )\n \n props = context.manage_FTPget()\n- if hasattr(props, \'read\'):\n+ if hasattr(props, "read"):\n props = props.read()\n export_context.writeDataFile(\n- \'.data\',\n+ ".data",\n text=props,\n- content_type=\'text/plain\',\n+ content_type="text/plain",\n subdir=subdir,\n )\n \n@@ -87,19 +86,18 @@ def export(self, export_context, subdir, root=False):\n adapter.export(export_context, subdir)\n \n def import_(self, import_context, subdir, root=False):\n- """ See IFilesystemImporter.\n- """\n+ """See IFilesystemImporter."""\n context = self.context\n if not root:\n- subdir = \'%s/%s\' % (subdir, context.getId())\n+ subdir = "%s/%s" % (subdir, context.getId())\n \n- data = import_context.readDataFile(\'.data\', subdir)\n+ data = import_context.readDataFile(".data", subdir)\n if data is not None:\n request = FauxDAVRequest(BODY=data, BODYFILE=BytesIO(data))\n response = FauxDAVResponse()\n context.PUT(request, response)\n \n- preserve = import_context.readDataFile(\'.preserve\', subdir)\n+ preserve = import_context.readDataFile(".preserve", subdir)\n must_preserve = self._mustPreserve()\n \n prior = context.objectIds()\n@@ -109,7 +107,7 @@ def import_(self, import_context, subdir, root=False):\n else:\n # Make sure ``preserve`` is a native string\n if six.PY3 and not isinstance(preserve, str):\n- preserve = preserve.decode(\'utf-8\')\n+ preserve = preserve.decode("utf-8")\n preserve = _globtest(preserve, prior)\n \n preserve.extend([x[0] for x in must_preserve])\n@@ -118,13 +116,13 @@ def import_(self, import_context, subdir, root=False):\n if id not in preserve:\n context._delObject(id)\n \n- objects = import_context.readDataFile(\'.objects\', subdir)\n+ objects = import_context.readDataFile(".objects", subdir)\n if objects is None:\n return\n \n- dialect = \'excel\'\n+ dialect = "excel"\n if six.PY3 and not isinstance(objects, str):\n- objects = objects.decode(\'utf-8\')\n+ objects = objects.decode("utf-8")\n stream = StringIO(objects)\n \n rowiter = reader(stream, dialect)\n@@ -135,12 +133,14 @@ def import_(self, import_context, subdir, root=False):\n for object_id, type_name in rows:\n \n if object_id not in existing:\n- object = self._makeInstance(object_id, type_name,\n- subdir, import_context)\n+ object = self._makeInstance(\n+ object_id, type_name, subdir, import_context\n+ )\n if object is None:\n- logger = import_context.getLogger(\'SFWA\')\n- logger.warning("Couldn\'t make instance: %s/%s" %\n- (subdir, object_id))\n+ logger = import_context.getLogger("SFWA")\n+ logger.warning(\n+ "Couldn\'t make instance: %s/%s" % (subdir, object_id)\n+ )\n continue\n \n wrapped = context._getOb(object_id)\ndiff --git a/plone/dexterity/factory.py b/plone/dexterity/factory.py\nindex 56be581..8f0eef5 100644\n--- a/plone/dexterity/factory.py\n+++ b/plone/dexterity/factory.py\n@@ -11,8 +11,7 @@\n \n @implementer(IDexterityFactory)\n class DexterityFactory(Persistent, Factory):\n- """A factory for Dexterity content.\n- """\n+ """A factory for Dexterity content."""\n \n def __init__(self, portal_type):\n self.portal_type = portal_type\n@@ -33,8 +32,8 @@ def __call__(self, *args, **kw):\n klass = resolveDottedName(fti.klass)\n if klass is None or not callable(klass):\n raise ValueError(\n- "Content class %s set for type %s is not valid" %\n- (fti.klass, self.portal_type)\n+ "Content class %s set for type %s is not valid"\n+ % (fti.klass, self.portal_type)\n )\n \n try:\n@@ -47,7 +46,7 @@ def __call__(self, *args, **kw):\n \n # Set portal_type if not set, but avoid creating an instance variable\n # if possible\n- if getattr(obj, \'portal_type\', \'\') != self.portal_type:\n+ if getattr(obj, "portal_type", "") != self.portal_type:\n obj.portal_type = self.portal_type\n \n return obj\n@@ -59,4 +58,4 @@ def getInterfaces(self):\n return spec\n \n def __repr__(self):\n- return \'<%s for %s>\' % (self.__class__.__name__, self.portal_type)\n+ return "<%s for %s>" % (self.__class__.__name__, self.portal_type)\ndiff --git a/plone/dexterity/filerepresentation.py b/plone/dexterity/filerepresentation.py\nindex c0ed037..58a0d84 100644\n--- a/plone/dexterity/filerepresentation.py\n+++ b/plone/dexterity/filerepresentation.py\n@@ -71,7 +71,7 @@ def get_size(self):\n if sized is None:\n return 0\n unit, size = sized.sizeForSorting()\n- if unit in (\'byte\', \'bytes\'):\n+ if unit in ("byte", "bytes"):\n return size\n return 0\n \n@@ -87,7 +87,7 @@ def getSize(self):\n adapter = schema(self)\n for name, field in getFieldsInOrder(schema):\n value = getattr(adapter, name, None)\n- if hasattr(value, \'getSize\'):\n+ if hasattr(value, "getSize"):\n size += value.getSize()\n return size\n \n@@ -106,8 +106,7 @@ def Format(self):\n \n @security.protected(permissions.View)\n def manage_DAVget(self):\n- """Get the body of the content item in a WebDAV response.\n- """\n+ """Get the body of the content item in a WebDAV response."""\n return self.manage_FTPget()\n \n @security.protected(permissions.View)\n@@ -119,7 +118,7 @@ def manage_FTPget(self, REQUEST=None, RESPONSE=None):\n """\n reader = IRawReadFile(self, None)\n if reader is None:\n- return \'\'\n+ return ""\n \n request = REQUEST is not None and REQUEST or self.REQUEST\n response = RESPONSE is not None and RESPONSE or request.response\n@@ -130,14 +129,19 @@ def manage_FTPget(self, REQUEST=None, RESPONSE=None):\n if mimeType is not None:\n if encoding is not None:\n response.setHeader(\n- \'Content-Type\', \'%s; charset="%s"\' % (mimeType, encoding,)\n+ "Content-Type",\n+ \'%s; charset="%s"\'\n+ % (\n+ mimeType,\n+ encoding,\n+ ),\n )\n else:\n- response.setHeader(\'Content-Type\', mimeType)\n+ response.setHeader("Content-Type", mimeType)\n \n size = reader.size()\n if size is not None:\n- response.setHeader(\'Content-Length\', str(size))\n+ response.setHeader("Content-Length", str(size))\n \n # if the reader is an iterator that the publisher can handle, return\n # it as-is. Otherwise, read the full contents\n@@ -163,7 +167,7 @@ def PUT(self, REQUEST=None, RESPONSE=None):\n self.dav__init(request, response)\n self.dav__simpleifhandler(request, response, refresh=1)\n \n- infile = request.get(\'BODYFILE\', None)\n+ infile = request.get("BODYFILE", None)\n if infile is None:\n raise MethodNotAllowed(\n "Cannot complete PUT request: No BODYFILE in request"\n@@ -175,17 +179,17 @@ def PUT(self, REQUEST=None, RESPONSE=None):\n "Cannot complete PUT request: No IRawWriteFile adapter found"\n )\n \n- contentTypeHeader = request.get_header(\'content-type\', None)\n+ contentTypeHeader = request.get_header("content-type", None)\n \n if contentTypeHeader is not None:\n msg = Message()\n- msg[\'Content-Type\'] = contentTypeHeader\n+ msg["Content-Type"] = contentTypeHeader\n \n mimeType = msg.get_content_type()\n if mimeType is not None:\n writer.mimeType = mimeType\n \n- charset = msg.get_param(\'charset\')\n+ charset = msg.get_param("charset")\n if charset is not None:\n writer.encoding = charset\n \n@@ -266,7 +270,7 @@ class FolderDataResource(Implicit, Resource):\n security = ClassSecurityInfo()\n \n def __init__(self, name, parent):\n- self.__dict__.update({\'__parent__\': parent, \'__name__\': name})\n+ self.__dict__.update({"__parent__": parent, "__name__": name})\n \n # We need to proxy certain things to the parent for getting and setting\n # of property sheet values to work.\n@@ -316,14 +320,12 @@ def HEAD(self, REQUEST, RESPONSE):\n \n @security.protected(permissions.ListFolderContents)\n def OPTIONS(self, REQUEST, RESPONSE):\n- """OPTIONS request: delegate to parent\n- """\n+ """OPTIONS request: delegate to parent"""\n return self.__parent__.OPTIONS(REQUEST, RESPONSE)\n \n @security.protected(permissions.View)\n def TRACE(self, REQUEST, RESPONSE):\n- """TRACE request: delegate to parent\n- """\n+ """TRACE request: delegate to parent"""\n return self.__parent__.TRACE(REQUEST, RESPONSE)\n \n @security.protected(permissions.View)\n@@ -346,78 +348,61 @@ def PROPPATCH(self, REQUEST, RESPONSE):\n \n @security.protected(permissions.ModifyPortalContent)\n def LOCK(self, REQUEST, RESPONSE):\n- """LOCK request: delegate to parent\n- """\n+ """LOCK request: delegate to parent"""\n return self.__parent__.LOCK(REQUEST, RESPONSE)\n \n @security.protected(permissions.ModifyPortalContent)\n def UNLOCK(self, REQUEST, RESPONSE):\n- """UNLOCK request: delegate to parent\n- """\n+ """UNLOCK request: delegate to parent"""\n return self.__parent__.UNLOCK(REQUEST, RESPONSE)\n \n @security.protected(permissions.ModifyPortalContent)\n def PUT(self, REQUEST, RESPONSE):\n- """PUT request: delegate to parent\n- """\n+ """PUT request: delegate to parent"""\n return self.__parent__.PUT(REQUEST, RESPONSE)\n \n @security.protected(permissions.AddPortalContent)\n def MKCOL(self, REQUEST, RESPONSE):\n- """MKCOL request: not allowed\n- """\n+ """MKCOL request: not allowed"""\n raise MethodNotAllowed(\n- \'Cannot create a collection inside a folder data: try at the \'\n- \'folder level instead\'\n+ "Cannot create a collection inside a folder data: try at the "\n+ "folder level instead"\n )\n \n @security.protected(permissions.DeleteObjects)\n def DELETE(self, REQUEST, RESPONSE):\n- """DELETE request: not allowed\n- """\n- raise MethodNotAllowed(\n- \'Cannot delete folder data: delete folder instead\'\n- )\n+ """DELETE request: not allowed"""\n+ raise MethodNotAllowed("Cannot delete folder data: delete folder instead")\n \n @security.protected(permissions.AddPortalContent)\n def COPY(self, REQUEST, RESPONSE):\n- """COPY request: not allowed\n- """\n- raise MethodNotAllowed(\n- \'Cannot copy folder data: copy the folder instead\'\n- )\n+ """COPY request: not allowed"""\n+ raise MethodNotAllowed("Cannot copy folder data: copy the folder instead")\n \n @security.protected(permissions.AddPortalContent)\n def MOVE(self, REQUEST, RESPONSE):\n- """MOVE request: not allowed\n- """\n- raise MethodNotAllowed(\n- \'Cannot move folder data: move the folder instead\'\n- )\n+ """MOVE request: not allowed"""\n+ raise MethodNotAllowed("Cannot move folder data: move the folder instead")\n \n @security.protected(permissions.View)\n def manage_DAVget(self):\n- """DAV content access: delete to manage_FTPget()\n- """\n+ """DAV content access: delete to manage_FTPget()"""\n return self.__parent__.manage_DAVget()\n \n @security.protected(permissions.View)\n def manage_FTPget(self):\n- """FTP access: delegate to parent\n- """\n+ """FTP access: delegate to parent"""\n return self.__parent__.manage_FTPget()\n \n @security.protected(permissions.ListFolderContents)\n def listDAVObjects(self):\n- """DAV object listing: return nothing\n- """\n+ """DAV object listing: return nothing"""\n return []\n \n \n @implementer(IStreamIterator)\n class StringStreamIterator(object):\n- """Simple stream iterator to allow efficient data streaming.\n- """\n+ """Simple stream iterator to allow efficient data streaming."""\n \n def __init__(self, data, size=None, chunk=1 << 16):\n """Consume data (a str) into a temporary file and prepare streaming.\n@@ -427,11 +412,11 @@ def __init__(self, data, size=None, chunk=1 << 16):\n \n chunk is the chunk size for the iterator\n """\n- f = tempfile.TemporaryFile(mode=\'w+b\')\n+ f = tempfile.TemporaryFile(mode="w+b")\n f.write(data)\n \n if size is not None:\n- assert size == f.tell(), \'Size argument does not match data length\'\n+ assert size == f.tell(), "Size argument does not match data length"\n else:\n size = f.tell()\n \n@@ -488,12 +473,12 @@ def __init__(self, context):\n def __call__(self, name, contentType, data):\n \n # Deal with Finder cruft\n- if name == \'.DS_Store\':\n+ if name == ".DS_Store":\n raise Unauthorized("Refusing to store Mac OS X resource forks")\n- elif name.startswith(\'._\'):\n+ elif name.startswith("._"):\n raise Unauthorized("Refusing to store Mac OS X resource forks")\n \n- registry = getToolByName(self.context, \'content_type_registry\', None)\n+ registry = getToolByName(self.context, "content_type_registry", None)\n if registry is None:\n return None # fall back on default\n \n@@ -501,7 +486,7 @@ def __call__(self, name, contentType, data):\n if typeObjectName is None:\n return # fall back on default\n \n- typesTool = getToolByName(self.context, \'portal_types\')\n+ typesTool = getToolByName(self.context, "portal_types")\n \n targetType = typesTool.getTypeInfo(typeObjectName)\n if targetType is None:\n@@ -529,19 +514,17 @@ def __call__(self, name, contentType, data):\n if contextType is not None:\n if not contextType.allowType(typeObjectName):\n raise Unauthorized(\n- "Creating a %s object here is not allowed" %\n- typeObjectName\n+ "Creating a %s object here is not allowed" % typeObjectName\n )\n \n if not targetType.isConstructionAllowed(self.context):\n raise Unauthorized(\n- "Creating a %s object here is not allowed" %\n- typeObjectName\n+ "Creating a %s object here is not allowed" % typeObjectName\n )\n \n obj = createObject(targetType.factory, name)\n \n- if hasattr(obj, \'_setPortalTypeName\'):\n+ if hasattr(obj, "_setPortalTypeName"):\n obj._setPortalTypeName(targetType.getId())\n \n # we fire this event here, because NullResource.PUT will now go\n@@ -569,7 +552,7 @@ def __init__(self, context):\n self._size = 0\n \n mimeType = None\n- encoding = \'utf-8\'\n+ encoding = "utf-8"\n name = None\n \n @property\n@@ -649,19 +632,19 @@ def mimeType(self):\n if IPrimaryField.providedBy(field):\n if foundOne:\n # more than one primary field\n- return \'message/rfc822\'\n+ return "message/rfc822"\n else:\n foundOne = True\n # zero or one primary fields\n- return \'text/plain\'\n+ return "text/plain"\n if not self._getMessage().is_multipart():\n- return \'text/plain\'\n+ return "text/plain"\n else:\n- return \'message/rfc822\'\n+ return "message/rfc822"\n \n @property\n def encoding(self):\n- return self._getMessage().get_charset() or \'utf-8\'\n+ return self._getMessage().get_charset() or "utf-8"\n \n @property\n def name(self):\n@@ -679,13 +662,10 @@ def size(self):\n @memoize\n def _getMessage(self):\n # Construct message on demand.\n- message = constructMessageFromSchemata(\n- self.context,\n- iterSchemata(self.context)\n- )\n+ message = constructMessageFromSchemata(self.context, iterSchemata(self.context))\n \n # Store the portal type in a header, to allow it to be identifed later\n- message[\'Portal-Type\'] = self.context.portal_type\n+ message["Portal-Type"] = self.context.portal_type\n \n return message\n \n@@ -697,18 +677,17 @@ def _getStream(self):\n # publisher, which will serve it efficiently even after the\n # transaction is closed\n message = self._getMessage()\n- out = tempfile.TemporaryFile(mode=\'w+b\')\n+ out = tempfile.TemporaryFile(mode="w+b")\n if six.PY2:\n out.write(message.as_string())\n else:\n- out.write(message.as_string().encode(\'utf-8\'))\n+ out.write(message.as_string().encode("utf-8"))\n self._size = out.tell()\n out.seek(0)\n return out\n \n def __next__(self):\n- """ Iterate over the stream\n- """\n+ """Iterate over the stream"""\n return self._getStream().__next__()\n \n \n@@ -727,7 +706,7 @@ def __init__(self, context):\n self._written = 0\n \n mimeType = None\n- encoding = \'utf-8\'\n+ encoding = "utf-8"\n name = None\n \n @property\n@@ -785,7 +764,7 @@ def __init__(self, context):\n self.context = context\n \n self._mimeType = None\n- self._encoding = \'utf-8\'\n+ self._encoding = "utf-8"\n self._closed = False\n self._name = None\n self._written = 0\n@@ -797,9 +776,9 @@ def mimeType(self):\n if self._message is None:\n return self._mimeType\n elif not self._message.is_multipart():\n- return \'text/plain\'\n+ return "text/plain"\n else:\n- return \'message/rfc822\'\n+ return "message/rfc822"\n \n @mimeType.setter\n def mimeType(self, value):\n@@ -839,10 +818,7 @@ def close(self):\n self._message = self._parser.close()\n self._closed = True\n initializeObjectFromSchemata(\n- self.context,\n- iterSchemata(self.context),\n- self._message,\n- self._encoding\n+ self.context, iterSchemata(self.context), self._message, self._encoding\n )\n \n def write(self, data):\ndiff --git a/plone/dexterity/fti.py b/plone/dexterity/fti.py\nindex 05f1b87..8ae810c 100644\n--- a/plone/dexterity/fti.py\n+++ b/plone/dexterity/fti.py\n@@ -32,7 +32,6 @@\n \n @implementer(IDexterityFTIModificationDescription)\n class DexterityFTIModificationDescription(object):\n-\n def __init__(self, attribute, oldValue):\n self.attribute = attribute\n self.oldValue = oldValue\n@@ -40,105 +39,102 @@ def __init__(self, attribute, oldValue):\n \n @implementer(IDexterityFTI)\n class DexterityFTI(base.DynamicViewTypeInformation):\n- """A Dexterity FTI\n- """\n+ """A Dexterity FTI"""\n \n meta_type = "Dexterity FTI"\n \n- behaviors_type = \'ulines\'\n+ behaviors_type = "ulines"\n if six.PY2:\n- behaviors_type = \'lines\'\n+ behaviors_type = "lines"\n \n _properties = base.DynamicViewTypeInformation._properties + (\n {\n- \'id\': \'add_permission\',\n- \'type\': \'selection\',\n- \'select_variable\': \'possiblePermissionIds\',\n- \'mode\': \'w\',\n- \'label\': \'Add permission\',\n- \'description\': \'Permission needed to be able to add content of \'\n- \'this type\',\n+ "id": "add_permission",\n+ "type": "selection",\n+ "select_variable": "possiblePermissionIds",\n+ "mode": "w",\n+ "label": "Add permission",\n+ "description": "Permission needed to be able to add content of "\n+ "this type",\n },\n {\n- \'id\': \'klass\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Content type class\',\n- \'description\': \'Dotted name to the class that contains the \'\n- \'content type\'\n+ "id": "klass",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Content type class",\n+ "description": "Dotted name to the class that contains the " "content type",\n },\n {\n- \'id\': \'behaviors\',\n- \'type\': behaviors_type,\n- \'mode\': \'w\',\n- \'label\': \'Behaviors\',\n- \'description\': \'Names of enabled behaviors type\'\n+ "id": "behaviors",\n+ "type": behaviors_type,\n+ "mode": "w",\n+ "label": "Behaviors",\n+ "description": "Names of enabled behaviors type",\n },\n {\n- \'id\': \'schema\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Schema\',\n- \'description\': "Dotted name to the interface describing content "\n- "type\'s schema. This does not need to be given "\n- "if model_source or model_file are given, and "\n- "either contains an unnamed (default) schema."\n+ "id": "schema",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Schema",\n+ "description": "Dotted name to the interface describing content "\n+ "type\'s schema. This does not need to be given "\n+ "if model_source or model_file are given, and "\n+ "either contains an unnamed (default) schema.",\n },\n {\n- \'id\': \'model_source\',\n- \'type\': \'text\',\n- \'mode\': \'w\',\n- \'label\': \'Model source\',\n- \'description\': "XML source for the type\'s model. Note that this "\n- "takes precedence over any model file."\n+ "id": "model_source",\n+ "type": "text",\n+ "mode": "w",\n+ "label": "Model source",\n+ "description": "XML source for the type\'s model. Note that this "\n+ "takes precedence over any model file.",\n },\n {\n- \'id\': \'model_file\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Model file\',\n- \'description\': "Path to file containing the schema model. "\n- "This can be relative to a package, e.g. "\n- "\'my.package:myschema.xml\'."\n+ "id": "model_file",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Model file",\n+ "description": "Path to file containing the schema model. "\n+ "This can be relative to a package, e.g. "\n+ "\'my.package:myschema.xml\'.",\n },\n {\n- \'id\': \'schema_policy\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Content type schema policy\',\n- \'description\': \'Name of the schema policy.\'\n+ "id": "schema_policy",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Content type schema policy",\n+ "description": "Name of the schema policy.",\n },\n-\n )\n \n default_aliases = {\n- \'(Default)\': \'(dynamic view)\',\n- \'view\': \'(selected layout)\',\n- \'edit\': \'@@edit\',\n- \'sharing\': \'@@sharing\',\n+ "(Default)": "(dynamic view)",\n+ "view": "(selected layout)",\n+ "edit": "@@edit",\n+ "sharing": "@@sharing",\n }\n \n default_actions = [\n {\n- \'id\': \'view\',\n- \'title\': \'View\',\n- \'action\': \'string:${object_url}\',\n- \'permissions\': (\'View\',)\n+ "id": "view",\n+ "title": "View",\n+ "action": "string:${object_url}",\n+ "permissions": ("View",),\n },\n {\n- \'id\': \'edit\',\n- \'title\': \'Edit\',\n- \'action\': \'string:${object_url}/edit\',\n- \'permissions\': (\'Modify portal content\',)\n+ "id": "edit",\n+ "title": "Edit",\n+ "action": "string:${object_url}/edit",\n+ "permissions": ("Modify portal content",),\n },\n ]\n \n- immediate_view = \'view\'\n- default_view = \'view\'\n- view_methods = (\'view\',)\n- add_permission = \'cmf.AddPortalContent\'\n+ immediate_view = "view"\n+ default_view = "view"\n+ view_methods = ("view",)\n+ add_permission = "cmf.AddPortalContent"\n behaviors = []\n- klass = \'plone.dexterity.content.Item\'\n+ klass = "plone.dexterity.content.Item"\n model_source = """\\\n \n \n@@ -151,18 +147,20 @@ class DexterityFTI(base.DynamicViewTypeInformation):\n def __init__(self, *args, **kwargs):\n super(DexterityFTI, self).__init__(*args, **kwargs)\n \n- if \'aliases\' not in kwargs:\n+ if "aliases" not in kwargs:\n self.setMethodAliases(self.default_aliases)\n \n- if \'actions\' not in kwargs:\n+ if "actions" not in kwargs:\n for action in self.default_actions:\n- self.addAction(id=action[\'id\'],\n- name=action[\'title\'],\n- action=action[\'action\'],\n- condition=action.get(\'condition\'),\n- permission=action.get(\'permissions\', ()),\n- category=action.get(\'category\', \'object\'),\n- visible=action.get(\'visible\', True))\n+ self.addAction(\n+ id=action["id"],\n+ name=action["title"],\n+ action=action["action"],\n+ condition=action.get("condition"),\n+ permission=action.get("permissions", ()),\n+ category=action.get("category", "object"),\n+ visible=action.get("visible", True),\n+ )\n \n # Default factory name to be the FTI name\n if not self.factory:\n@@ -186,31 +184,29 @@ def __init__(self, *args, **kwargs):\n \n if not self.add_view_expr:\n add_view_expr = kwargs.get(\n- \'add_view_expr\',\n- "string:${folder_url}/++add++%s" % self.getId()\n+ "add_view_expr", "string:${folder_url}/++add++%s" % self.getId()\n )\n- self._setPropValue(\'add_view_expr\', add_view_expr)\n+ self._setPropValue("add_view_expr", add_view_expr)\n \n # Set the content_meta_type from the klass\n \n klass = utils.resolveDottedName(self.klass)\n if klass is not None:\n- self.content_meta_type = getattr(klass, \'meta_type\', None)\n+ self.content_meta_type = getattr(klass, "meta_type", None)\n \n def Title(self):\n if self.title and self.i18n_domain:\n if six.PY2:\n try:\n- return Message(self.title.decode(\'utf8\'), self.i18n_domain)\n+ return Message(self.title.decode("utf8"), self.i18n_domain)\n except UnicodeDecodeError:\n- return Message(\n- self.title.decode(\'latin-1\'), self.i18n_domain)\n+ return Message(self.title.decode("latin-1"), self.i18n_domain)\n else:\n return Message(self.title, self.i18n_domain)\n else:\n if six.PY2:\n if self.title:\n- return self.title.decode(\'utf8\')\n+ return self.title.decode("utf8")\n return self.getId()\n return self.title or self.getId()\n \n@@ -218,16 +214,14 @@ def Description(self):\n if self.description and self.i18n_domain:\n if six.PY2:\n try:\n- return Message(\n- self.description.decode(\'utf8\'), self.i18n_domain)\n+ return Message(self.description.decode("utf8"), self.i18n_domain)\n except UnicodeDecodeError:\n- return Message(\n- self.description.decode(\'latin-1\'), self.i18n_domain)\n+ return Message(self.description.decode("latin-1"), self.i18n_domain)\n else:\n return Message(self.description, self.i18n_domain)\n else:\n if six.PY2 and self.description:\n- return self.description.decode(\'utf8\')\n+ return self.description.decode("utf8")\n return self.description\n \n def Metatype(self):\n@@ -236,12 +230,12 @@ def Metatype(self):\n # BBB - this didn\'t use to be set\n klass = utils.resolveDottedName(self.klass)\n if klass is not None:\n- self.content_meta_type = getattr(klass, \'meta_type\', None)\n+ self.content_meta_type = getattr(klass, "meta_type", None)\n return self.content_meta_type\n \n @property\n def hasDynamicSchema(self):\n- return not(self.schema)\n+ return not (self.schema)\n \n def lookupSchema(self):\n schema = None\n@@ -252,8 +246,8 @@ def lookupSchema(self):\n schema = utils.resolveDottedName(self.schema)\n except ImportError:\n logging.warning(\n- u"Dexterity type FTI %s: schema dotted name [%s] cannot be resolved." %\n- (self.getId(), self.schema)\n+ u"Dexterity type FTI %s: schema dotted name [%s] cannot be resolved."\n+ % (self.getId(), self.schema)\n )\n # fall through to return a fake class with no\n # fields so that end user code doesn\'t break\n@@ -306,10 +300,10 @@ def _updateProperty(self, id, value):\n modified(self, DexterityFTIModificationDescription(id, oldValue))\n \n # Update meta_type from klass\n- if id == \'klass\':\n+ if id == "klass":\n klass = utils.resolveDottedName(new_value)\n if klass is not None:\n- self.content_meta_type = getattr(klass, \'meta_type\', None)\n+ self.content_meta_type = getattr(klass, "meta_type", None)\n \n # Allow us to specify a particular add permission rather than rely on ones\n # stored in meta types that we don\'t have anyway\n@@ -322,54 +316,54 @@ def isConstructionAllowed(self, container):\n if permission is None:\n return False\n \n- return bool(\n- getSecurityManager().checkPermission(\n- permission.title,\n- container\n- )\n- )\n+ return bool(getSecurityManager().checkPermission(permission.title, container))\n \n #\n # Helper methods\n #\n \n def possiblePermissionIds(self):\n- """Get a vocabulary of Zope 3 permission ids\n- """\n+ """Get a vocabulary of Zope 3 permission ids"""\n permission_names = set()\n for permission in getAllUtilitiesRegisteredFor(IPermission):\n permission_names.add(permission.id)\n return sorted(permission_names)\n \n def _absModelFile(self):\n- colons = self.model_file.count(\':\')\n+ colons = self.model_file.count(":")\n model_file = self.model_file\n \n # We have a package and not an absolute Windows path\n- if colons == 1 and self.model_file[1:3] != \':\\\\\':\n- package, filename = self.model_file.split(\':\')\n+ if colons == 1 and self.model_file[1:3] != ":\\\\":\n+ package, filename = self.model_file.split(":")\n mod = utils.resolveDottedName(package)\n # let / work as path separator on all platforms\n- filename = filename.replace(\'/\', os.path.sep)\n+ filename = filename.replace("/", os.path.sep)\n model_file = os.path.join(os.path.split(mod.__file__)[0], filename)\n else:\n if not os.path.isabs(model_file):\n raise ValueError(\n u"Model file name %s is not an absolute path and does "\n u"not contain a package name in %s"\n- % (model_file, self.getId(),)\n+ % (\n+ model_file,\n+ self.getId(),\n+ )\n )\n \n if not os.path.isfile(model_file):\n raise ValueError(\n u"Model file %s in %s cannot be found"\n- % (model_file, self.getId(),)\n+ % (\n+ model_file,\n+ self.getId(),\n+ )\n )\n \n return model_file\n \n \n-def _fixProperties(class_, ignored=[\'product\', \'content_meta_type\']):\n+def _fixProperties(class_, ignored=["product", "content_meta_type"]):\n """Remove properties with the given ids, and ensure that later properties\n override earlier ones with the same id\n """\n@@ -379,17 +373,19 @@ def _fixProperties(class_, ignored=[\'product\', \'content_meta_type\']):\n for item in reversed(class_._properties):\n item = item.copy()\n \n- if item[\'id\'] in processed:\n+ if item["id"] in processed:\n continue\n \n # Ignore some fields\n- if item[\'id\'] in ignored:\n+ if item["id"] in ignored:\n continue\n \n properties.append(item)\n- processed.add(\'id\')\n+ processed.add("id")\n \n class_._properties = tuple(reversed(properties))\n+\n+\n _fixProperties(DexterityFTI)\n \n \n@@ -397,9 +393,9 @@ def _fixProperties(class_, ignored=[\'product\', \'content_meta_type\']):\n def register(fti):\n """Helper method to:\n \n- - register an FTI as a local utility\n- - register a local factory utility\n- - register an add view\n+ - register an FTI as a local utility\n+ - register a local factory utility\n+ - register an add view\n """\n \n fti = aq_base(fti) # remove acquisition wrapper\n@@ -411,10 +407,7 @@ def register(fti):\n fti_utility = queryUtility(IDexterityFTI, name=portal_type)\n if fti_utility is None:\n site_manager.registerUtility(\n- fti,\n- IDexterityFTI,\n- portal_type,\n- info=\'plone.dexterity.dynamic\'\n+ fti, IDexterityFTI, portal_type, info="plone.dexterity.dynamic"\n )\n \n factory_utility = queryUtility(IFactory, name=fti.factory)\n@@ -423,16 +416,16 @@ def register(fti):\n DexterityFactory(portal_type),\n IFactory,\n fti.factory,\n- info=\'plone.dexterity.dynamic\'\n+ info="plone.dexterity.dynamic",\n )\n \n \n def unregister(fti, old_name=None):\n """Helper method to:\n \n- - unregister the FTI local utility\n- - unregister any local factory utility associated with the FTI\n- - unregister any local add view associated with the FTI\n+ - unregister the FTI local utility\n+ - unregister any local factory utility associated with the FTI\n+ - unregister any local add view associated with the FTI\n """\n site = queryUtility(ISiteRoot)\n if site is None:\n@@ -455,21 +448,24 @@ def unregister_factory(factory_name, site_manager):\n utilities = list(site_manager.registeredUtilities())\n # Do nothing if an FTI is still using it\n if factory_name in [\n- f.component.factory for f in utilities\n- if (f.provided, f.info) == (IDexterityFTI, \'plone.dexterity.dynamic\')\n+ f.component.factory\n+ for f in utilities\n+ if (f.provided, f.info) == (IDexterityFTI, "plone.dexterity.dynamic")\n ]:\n return\n \n # If a factory with a matching name exists, remove it\n- if [f for f in utilities\n+ if [\n+ f\n+ for f in utilities\n if (f.provided, f.name, f.info)\n- == (IFactory, factory_name, \'plone.dexterity.dynamic\')]:\n+ == (IFactory, factory_name, "plone.dexterity.dynamic")\n+ ]:\n site_manager.unregisterUtility(provided=IFactory, name=factory_name)\n \n \n def ftiAdded(object, event):\n- """When the FTI is created, install local components\n- """\n+ """When the FTI is created, install local components"""\n \n if not IDexterityFTI.providedBy(event.object):\n return\n@@ -478,8 +474,7 @@ def ftiAdded(object, event):\n \n \n def ftiRemoved(object, event):\n- """When the FTI is removed, uninstall local coponents\n- """\n+ """When the FTI is removed, uninstall local coponents"""\n \n if not IDexterityFTI.providedBy(event.object):\n return\n@@ -488,15 +483,16 @@ def ftiRemoved(object, event):\n \n \n def ftiRenamed(object, event):\n- """When the FTI is modified, ensure local components are still valid\n- """\n+ """When the FTI is modified, ensure local components are still valid"""\n \n if not IDexterityFTI.providedBy(event.object):\n return\n \n- if event.oldParent is None \\\n- or event.newParent is None \\\n- or event.oldName == event.newName:\n+ if (\n+ event.oldParent is None\n+ or event.newParent is None\n+ or event.oldName == event.newName\n+ ):\n return\n \n unregister(event.object, event.oldName)\n@@ -523,8 +519,8 @@ def ftiModified(object, event):\n # was registered as a local utility to begin with. If so, remove the\n # orphan.\n \n- if \'factory\' in mod:\n- old_factory = mod[\'factory\']\n+ if "factory" in mod:\n+ old_factory = mod["factory"]\n \n site = getUtility(ISiteRoot)\n site_manager = getSiteManager(site)\n@@ -539,26 +535,29 @@ def ftiModified(object, event):\n DexterityFactory(portal_type),\n IFactory,\n fti.factory,\n- info=\'plone.dexterity.dynamic\'\n+ info="plone.dexterity.dynamic",\n )\n \n # Determine if we need to invalidate the schema at all\n- if \'behaviors\' in mod \\\n- or \'schema\' in mod \\\n- or \'model_source\' in mod \\\n- or \'model_file\' in mod \\\n- or \'schema_policy\' in mod:\n+ if (\n+ "behaviors" in mod\n+ or "schema" in mod\n+ or "model_source" in mod\n+ or "model_file" in mod\n+ or "schema_policy" in mod\n+ ):\n \n # Determine if we need to re-sync a dynamic schema\n- if (fti.model_source or fti.model_file) \\\n- and (\'model_source\' in mod or \'model_file\' in mod or \'schema_policy\' in mod):\n+ if (fti.model_source or fti.model_file) and (\n+ "model_source" in mod or "model_file" in mod or "schema_policy" in mod\n+ ):\n \n mtime = getattr(fti, "_p_mtime", None) or ""\n schemaName = portalTypeToSchemaName(portal_type, suffix=str(mtime))\n schema = getattr(plone.dexterity.schema.generated, schemaName)\n \n model = fti.lookupModel()\n- sync_bases = \'schema_policy\' in mod\n+ sync_bases = "schema_policy" in mod\n syncSchema(model.schema, schema, overwrite=True, sync_bases=sync_bases)\n \n notify(SchemaInvalidatedEvent(portal_type))\ndiff --git a/plone/dexterity/interfaces.py b/plone/dexterity/interfaces.py\nindex e36cbe8..cf5dc42 100644\n--- a/plone/dexterity/interfaces.py\n+++ b/plone/dexterity/interfaces.py\n@@ -12,16 +12,17 @@\n try:\n from zope.app.content import IContentType\n except ImportError:\n+\n class IContentType(Interface):\n pass\n \n+\n # id for pseudo-resource used to expose data for folderish items over WebDAV\n-DAV_FOLDER_DATA_ID = \'_data\'\n+DAV_FOLDER_DATA_ID = "_data"\n \n \n class IDexterityFTI(ITypeInformation):\n- """The Factory Type Information for Dexterity content objects\n- """\n+ """The Factory Type Information for Dexterity content objects"""\n \n def lookupSchema():\n """Return an InterfaceClass that represents the schema of this type.\n@@ -48,49 +49,45 @@ def lookupModel():\n add_permission = zope.schema.DottedName(\n title=u"Add permission",\n description=u"Zope 3 permission name for the permission required to "\n- u"construct this content",\n+ u"construct this content",\n )\n \n behaviors = zope.schema.List(\n title=u"Behaviors",\n description=u"A list of behaviors that are enabled for this type. "\n- u"See plone.behavior for more details.",\n- value_type=zope.schema.DottedName(title=u"Behavior name")\n+ u"See plone.behavior for more details.",\n+ value_type=zope.schema.DottedName(title=u"Behavior name"),\n )\n \n schema = zope.schema.DottedName(\n title=u"Schema interface",\n description=u"Dotted name to an interface describing the type. "\n- u"This is not required if there is a model file or a "\n- u"model source string containing an unnamed schema."\n+ u"This is not required if there is a model file or a "\n+ u"model source string containing an unnamed schema.",\n )\n \n model_source = zope.schema.Text(\n title=u"Model text",\n- description=u"XML representation of the model for this type. " +\n- u"If this is given, it will override any model_file."\n+ description=u"XML representation of the model for this type. "\n+ + u"If this is given, it will override any model_file.",\n )\n \n model_file = zope.schema.Text(\n title=u"Model file",\n description=u"A file that contains an XML model. "\n- u"This may be an absolute path, or one relative to a "\n- u"package, e.g. my.package:model.xml"\n+ u"This may be an absolute path, or one relative to a "\n+ u"package, e.g. my.package:model.xml",\n )\n \n hasDynamicSchema = zope.schema.Bool(\n- title=u"Whether or not the FTI uses a dynamic schema.",\n- readonly=True\n+ title=u"Whether or not the FTI uses a dynamic schema.", readonly=True\n )\n \n \n class IDexterityFTIModificationDescription(IModificationDescription):\n- """Descriptor passed with an IObjectModifiedEvent for a Dexterity FTI.\n- """\n+ """Descriptor passed with an IObjectModifiedEvent for a Dexterity FTI."""\n \n- attribute = zope.schema.ASCII(\n- title=u"Name of the attribute that was modified"\n- )\n+ attribute = zope.schema.ASCII(title=u"Name of the attribute that was modified")\n oldValue = Attribute("Old value")\n \n \n@@ -104,15 +101,13 @@ class IDexterityFactory(IFactory):\n """\n \n portal_type = zope.schema.TextLine(\n- title=u"Portal type name",\n- description=u"The portal type this is an FTI for"\n+ title=u"Portal type name", description=u"The portal type this is an FTI for"\n )\n \n \n # Schema\n class IDexteritySchema(Interface):\n- """Base class for Dexterity schemata\n- """\n+ """Base class for Dexterity schemata"""\n \n \n # Schema cache\n@@ -128,29 +123,24 @@ class ISchemaInvalidatedEvent(Interface):\n \n # Content\n class IDexterityContent(Interface):\n- """Marker interface for dexterity-managed content objects\n- """\n+ """Marker interface for dexterity-managed content objects"""\n \n \n class IDexterityItem(IDexterityContent):\n- """Marker interface applied to dexterity-managed non-folderish objects\n- """\n+ """Marker interface applied to dexterity-managed non-folderish objects"""\n \n \n class IDexterityContainer(IDexterityContent):\n- """Marker interface applied to dexterity-managed folderish objects\n- """\n+ """Marker interface applied to dexterity-managed folderish objects"""\n \n \n # Events\n class IBegunEvent(IObjectEvent):\n- """Base begun event\n- """\n+ """Base begun event"""\n \n \n class IEditBegunEvent(IBegunEvent):\n- """An edit operation was begun\n- """\n+ """An edit operation was begun"""\n \n \n class IAddBegunEvent(IBegunEvent):\n@@ -160,13 +150,11 @@ class IAddBegunEvent(IBegunEvent):\n \n \n class ICancelledEvent(IObjectEvent):\n- """Base cancel event\n- """\n+ """Base cancel event"""\n \n \n class IEditCancelledEvent(ICancelledEvent):\n- """An edit operation was cancelled\n- """\n+ """An edit operation was cancelled"""\n \n \n class IAddCancelledEvent(ICancelledEvent):\ndiff --git a/plone/dexterity/primary.py b/plone/dexterity/primary.py\nindex fb58ccc..759d530 100644\n--- a/plone/dexterity/primary.py\n+++ b/plone/dexterity/primary.py\n@@ -11,7 +11,6 @@\n @implementer(IPrimaryFieldInfo)\n @adapter(IDexterityContent)\n class PrimaryFieldInfo(object):\n-\n def __init__(self, context):\n self.context = context\n primary = None\n@@ -22,7 +21,7 @@ def __init__(self, context):\n primary = (name, field)\n break\n if not primary:\n- raise TypeError(\'Could not adapt\', context, IPrimaryFieldInfo)\n+ raise TypeError("Could not adapt", context, IPrimaryFieldInfo)\n self.fieldname, self.field = primary\n \n @property\ndiff --git a/plone/dexterity/schema.py b/plone/dexterity/schema.py\nindex 0e1d41d..c913609 100644\n--- a/plone/dexterity/schema.py\n+++ b/plone/dexterity/schema.py\n@@ -32,22 +32,22 @@\n log = logging.getLogger(__name__)\n \n # Dynamic modules\n-generated = dynamic.create(\'plone.dexterity.schema.generated\')\n-transient = types.ModuleType(\'transient\')\n+generated = dynamic.create("plone.dexterity.schema.generated")\n+transient = types.ModuleType("transient")\n \n _MARKER = dict()\n \n-FTI_CACHE_KEY = \'__plone_dexterity_fti_cache__\'\n+FTI_CACHE_KEY = "__plone_dexterity_fti_cache__"\n \n \n def invalidate_cache(fti):\n fti._p_activate()\n- fti.__dict__.pop(\'_v_schema_get\', None)\n- fti.__dict__.pop(\'_v_schema_behavior_registrations\', None)\n- fti.__dict__.pop(\'_v_schema_subtypes\', None)\n- fti.__dict__.pop(\'_v_schema_schema_interfaces\', None)\n- fti.__dict__.pop(\'_v_schema_modified\', None)\n- fti.__dict__.pop(\'_v_schema_behavior_schema_interfaces\', None)\n+ fti.__dict__.pop("_v_schema_get", None)\n+ fti.__dict__.pop("_v_schema_behavior_registrations", None)\n+ fti.__dict__.pop("_v_schema_subtypes", None)\n+ fti.__dict__.pop("_v_schema_schema_interfaces", None)\n+ fti.__dict__.pop("_v_schema_modified", None)\n+ fti.__dict__.pop("_v_schema_behavior_schema_interfaces", None)\n request = getRequest()\n if request:\n setattr(request, FTI_CACHE_KEY, None)\n@@ -69,8 +69,7 @@ def lookup_fti(portal_type, cache=True):\n fti = fti_cache[portal_type]\n else:\n fti_cache[portal_type] = fti = queryUtility(\n- IDexterityFTI,\n- name=portal_type\n+ IDexterityFTI, name=portal_type\n )\n return fti\n return queryUtility(IDexterityFTI, name=portal_type)\n@@ -78,12 +77,11 @@ def lookup_fti(portal_type, cache=True):\n # its already an IDexterityFTI instance\n return portal_type\n raise ValueError(\n- \'portal_type has to either string or IDexterityFTI instance but is \'\n- \'{0!r}\'.format(portal_type)\n+ "portal_type has to either string or IDexterityFTI instance but is "\n+ "{0!r}".format(portal_type)\n )\n \n \n-\n def volatile(func):\n @functools.wraps(func)\n def decorator(self, portal_type):\n@@ -100,7 +98,7 @@ def decorator(self, portal_type):\n if fti is None:\n return func(self, None)\n if self.cache_enabled:\n- key = \'_v_schema_%s\' % func.__name__\n+ key = "_v_schema_%s" % func.__name__\n cache = getattr(fti, key, _MARKER)\n if cache is not _MARKER:\n mtime, value = cache\n@@ -113,6 +111,7 @@ def decorator(self, portal_type):\n setattr(fti, key, (fti._p_mtime, value))\n \n return value\n+\n return decorator\n \n \n@@ -177,10 +176,8 @@ def behavior_registrations(self, fti):\n warnings.warn(\n \'No behavior registration found for behavior named "{0}"\'\n \' for factory "{1}"\'\n- \' - trying deprecated fallback lookup (will be removed \'\n- \'in 3.0)..."\'.format(\n- behavior_name, fti.getId()\n- ),\n+ " - trying deprecated fallback lookup (will be removed "\n+ \'in 3.0)..."\'.format(behavior_name, fti.getId()),\n DeprecationWarning,\n )\n try:\n@@ -197,7 +194,7 @@ def behavior_registrations(self, fti):\n description="bbb fallback lookup",\n interface=schema_interface,\n marker=None,\n- factory=None\n+ factory=None,\n )\n registrations.append(registration)\n return tuple(registrations)\n@@ -212,8 +209,10 @@ def subtypes(self, fti):\n return ()\n subtypes = []\n for behavior_registration in self.behavior_registrations(fti):\n- if behavior_registration is not None \\\n- and behavior_registration.marker is not None:\n+ if (\n+ behavior_registration is not None\n+ and behavior_registration.marker is not None\n+ ):\n subtypes.append(behavior_registration.marker)\n return tuple(subtypes)\n \n@@ -227,8 +226,7 @@ def behavior_schema_interfaces(self, fti):\n return ()\n schemas = []\n for behavior_registration in self.behavior_registrations(fti):\n- if behavior_registration is not None \\\n- and behavior_registration.interface:\n+ if behavior_registration is not None and behavior_registration.interface:\n schemas.append(behavior_registration.interface)\n return tuple(schemas)\n \n@@ -279,7 +277,6 @@ def modified(self, fti):\n \n @implementer(ISchemaInvalidatedEvent)\n class SchemaInvalidatedEvent(object):\n-\n def __init__(self, portal_type):\n self.portal_type = portal_type\n \n@@ -294,15 +291,14 @@ def invalidate_schema(event):\n \n # here starts the code dealing wih dynamic schemas.\n class SchemaNameEncoder(object):\n- """Schema name encoding\n- """\n+ """Schema name encoding"""\n \n key = (\n- (\' \', \'_1_\'),\n- (\'.\', \'_2_\'),\n- (\'-\', \'_3_\'),\n- (\'/\', \'_4_\'),\n- (\'|\', \'_5_\'),\n+ (" ", "_1_"),\n+ (".", "_2_"),\n+ ("-", "_3_"),\n+ ("/", "_4_"),\n+ ("|", "_5_"),\n )\n \n def encode(self, s):\n@@ -316,34 +312,31 @@ def decode(self, s):\n return s\n \n def join(self, *args):\n- return \'_0_\'.join([self.encode(a) for a in args if a])\n+ return "_0_".join([self.encode(a) for a in args if a])\n \n def split(self, s):\n- return [self.decode(a) for a in s.split(\'_0_\')]\n+ return [self.decode(a) for a in s.split("_0_")]\n \n \n def portalTypeToSchemaName(portal_type, schema=u"", prefix=None, suffix=None):\n- """Return a canonical interface name for a generated schema interface.\n- """\n+ """Return a canonical interface name for a generated schema interface."""\n if prefix is None:\n- prefix = \'/\'.join(getUtility(ISiteRoot).getPhysicalPath())[1:]\n+ prefix = "/".join(getUtility(ISiteRoot).getPhysicalPath())[1:]\n if suffix:\n- prefix = \'|\'.join([prefix, suffix])\n+ prefix = "|".join([prefix, suffix])\n \n encoder = SchemaNameEncoder()\n return encoder.join(prefix, portal_type, schema)\n \n \n def schemaNameToPortalType(schemaName):\n- """Return a the portal_type part of a schema name\n- """\n+ """Return a the portal_type part of a schema name"""\n encoder = SchemaNameEncoder()\n return encoder.split(schemaName)[1]\n \n \n def splitSchemaName(schemaName):\n- """Return a tuple prefix, portal_type, schemaName\n- """\n+ """Return a tuple prefix, portal_type, schemaName"""\n encoder = SchemaNameEncoder()\n items = encoder.split(schemaName)\n if len(items) == 2:\n@@ -357,8 +350,7 @@ def splitSchemaName(schemaName):\n # Dynamic module factory\n @implementer(IDynamicObjectFactory)\n class SchemaModuleFactory(object):\n- """Create dynamic schema interfaces on the fly\n- """\n+ """Create dynamic schema interfaces on the fly"""\n \n lock = RLock()\n _transient_SCHEMA_CACHE = {}\n@@ -429,7 +421,7 @@ class DexteritySchemaPolicy(object):\n """\n \n def module(self, schemaName, tree):\n- return \'plone.dexterity.schema.transient\'\n+ return "plone.dexterity.schema.transient"\n \n def bases(self, schemaName, tree):\n return ()\n@@ -438,4 +430,4 @@ def name(self, schemaName, tree):\n # We use a temporary name whilst the interface is being generated;\n # when it\'s first used, we know the portal_type and site, and can\n # thus update it\n- return \'__tmp__\' + schemaName\n+ return "__tmp__" + schemaName\ndiff --git a/plone/dexterity/tests/case.py b/plone/dexterity/tests/case.py\nindex 04fb32e..9b6b879 100644\n--- a/plone/dexterity/tests/case.py\n+++ b/plone/dexterity/tests/case.py\n@@ -15,8 +15,7 @@\n \n \n class MockTestCase(unittest.TestCase):\n- """Base class for tests using mocks.\n- """\n+ """Base class for tests using mocks."""\n \n _getToolByName_return_values = None\n _replaced_globals = None\n@@ -38,27 +37,25 @@ def create_dummy(self, **kw):\n # wipe the registry each time.\n \n def mock_utility(self, mock, provides, name=u""):\n- """Register the mock as a utility providing the given interface\n- """\n- zope.component.provideUtility(\n- provides=provides, component=mock, name=name)\n+ """Register the mock as a utility providing the given interface"""\n+ zope.component.provideUtility(provides=provides, component=mock, name=name)\n \n def mock_adapter(self, mock, provides, adapts, name=u""):\n """Register the mock as an adapter providing the given interface\n and adapting the given interface(s)\n """\n zope.component.provideAdapter(\n- factory=mock, adapts=adapts, provides=provides, name=name)\n+ factory=mock, adapts=adapts, provides=provides, name=name\n+ )\n \n def mock_subscription_adapter(self, mock, provides, adapts):\n- """Register the mock as a utility providing the given interface\n- """\n+ """Register the mock as a utility providing the given interface"""\n zope.component.provideSubscriptionAdapter(\n- factory=mock, provides=provides, adapts=adapts)\n+ factory=mock, provides=provides, adapts=adapts\n+ )\n \n def mock_handler(self, mock, adapts):\n- """Register the mock as a utility providing the given interface\n- """\n+ """Register the mock as a utility providing the given interface"""\n zope.component.provideHandler(factory=mock, adapts=adapts)\n \n def mock_tool(self, mock, name):\n@@ -72,8 +69,8 @@ def get_return_value(context, name, default=None):\n return return_values.get(name, default)\n \n from Products.CMFCore.utils import getToolByName\n- self.patch_global(\n- getToolByName, side_effect=get_return_value)\n+\n+ self.patch_global(getToolByName, side_effect=get_return_value)\n self._getToolByName_return_values[name] = mock\n \n def patch_global(self, orig, mock=None, **kw):\n@@ -81,7 +78,8 @@ def patch_global(self, orig, mock=None, **kw):\n mock = Mock(**kw)\n elif kw:\n raise Exception(\n- \'Keyword arguments are ignored if a mock instance is passed.\')\n+ "Keyword arguments are ignored if a mock instance is passed."\n+ )\n _global_replace(orig, mock)\n if self._replaced_globals is None:\n self._replaced_globals = {}\n@@ -90,18 +88,17 @@ def patch_global(self, orig, mock=None, **kw):\n \n \n class Dummy(object):\n- """Dummy object with arbitrary attributes\n- """\n+ """Dummy object with arbitrary attributes"""\n \n def __init__(self, **kw):\n self.__dict__.update(kw)\n \n \n class ItemDummy(Dummy):\n- """ Dummy objects with title getter and setter """\n+ """Dummy objects with title getter and setter"""\n \n- title = \'\'\n- portal_type = \'foo\'\n+ title = ""\n+ portal_type = "foo"\n \n def Title(self):\n return self.title\n@@ -110,14 +107,14 @@ def setTitle(self, title):\n self.title = title\n \n def getId(self):\n- return self.__dict__.get(\'id\', \'\')\n+ return self.__dict__.get("id", "")\n \n \n # from mocker\n def _global_replace(remove, install):\n """Replace object \'remove\' with object \'install\' on all dictionaries."""\n for referrer in gc.get_referrers(remove):\n- if (type(referrer) is dict):\n+ if type(referrer) is dict:\n for key, value in list(six.iteritems(referrer)):\n if value is remove:\n referrer[key] = install\ndiff --git a/plone/dexterity/tests/schemata.py b/plone/dexterity/tests/schemata.py\nindex e99ef8a..d9ff6be 100644\n--- a/plone/dexterity/tests/schemata.py\n+++ b/plone/dexterity/tests/schemata.py\n@@ -5,23 +5,19 @@\n \n \n class ITestSchema(Interface):\n- """Schema used for testing\n- """\n+ """Schema used for testing"""\n \n- title = schema.TextLine(title=u"Title",\n- description=u"Administrative title")\n+ title = schema.TextLine(title=u"Title", description=u"Administrative title")\n \n- description = schema.Text(title=u"Description",\n- required=False)\n+ description = schema.Text(title=u"Description", required=False)\n \n \n class ITaggedValueSchema(Interface):\n- """Schema used for testing tagged value filenames\n- """\n+ """Schema used for testing tagged value filenames"""\n \n-ITaggedValueSchema.setTaggedValue(FILENAME_KEY, \'/path/to/dummy.xml\')\n+\n+ITaggedValueSchema.setTaggedValue(FILENAME_KEY, "/path/to/dummy.xml")\n \n \n class IDerivedFromTaggedValueSchema(ITaggedValueSchema):\n- """Schema used for testing tagged value filenames\n- """\n+ """Schema used for testing tagged value filenames"""\ndiff --git a/plone/dexterity/tests/test_behavior.py b/plone/dexterity/tests/test_behavior.py\nindex fecad85..dcf3264 100644\n--- a/plone/dexterity/tests/test_behavior.py\n+++ b/plone/dexterity/tests/test_behavior.py\n@@ -24,7 +24,6 @@ class IFour(IThree):\n \n \n class TestBehavior(MockTestCase):\n-\n def test_supports(self):\n \n # Context mock\n@@ -32,17 +31,9 @@ def test_supports(self):\n \n # Behavior mock\n behavior_dummy_1 = self.create_dummy(interface=IOne)\n- self.mock_utility(\n- behavior_dummy_1,\n- IBehavior,\n- name=IOne.__identifier__\n- )\n+ self.mock_utility(behavior_dummy_1, IBehavior, name=IOne.__identifier__)\n behavior_dummy_4 = self.create_dummy(interface=IFour)\n- self.mock_utility(\n- behavior_dummy_4,\n- IBehavior,\n- name=IFour.__identifier__\n- )\n+ self.mock_utility(behavior_dummy_4, IBehavior, name=IFour.__identifier__)\n \n # FTI mock\n fti = DexterityFTI(u"testtype")\n@@ -72,7 +63,4 @@ def test_enumerate(self):\n \n assignable = DexterityBehaviorAssignable(context_dummy)\n \n- self.assertEqual(\n- [behavior_dummy],\n- list(assignable.enumerateBehaviors())\n- )\n+ self.assertEqual([behavior_dummy], list(assignable.enumerateBehaviors()))\ndiff --git a/plone/dexterity/tests/test_content.py b/plone/dexterity/tests/test_content.py\nindex bd86c50..2844138 100644\n--- a/plone/dexterity/tests/test_content.py\n+++ b/plone/dexterity/tests/test_content.py\n@@ -41,14 +41,12 @@\n \n \n class TestContent(MockTestCase):\n-\n def setUp(self):\n SCHEMA_CACHE.clear()\n provideAdapter(DefaultOrdering)\n provideAdapter(AttributeAnnotations)\n \n def test_provided_by_item(self):\n-\n class FauxDataManager(object):\n def setstate(self, obj):\n pass\n@@ -60,8 +58,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = Item(id=u\'id\')\n- item.portal_type = u\'testtype\'\n+ item = Item(id=u"id")\n+ item.portal_type = u"testtype"\n item._p_jar = FauxDataManager()\n \n # Dummy schema\n@@ -73,7 +71,7 @@ class IMarker(Interface):\n pass\n \n # FTI mock\n- fti_mock = Mock(wraps=DexterityFTI(\'testtype\'))\n+ fti_mock = Mock(wraps=DexterityFTI("testtype"))\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n@@ -115,8 +113,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n item._p_jar = FauxDataManager()\n \n # Dummy schema\n@@ -158,8 +156,8 @@ class MyItem(Item):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n \n # Without a persistence jar, the _p_changed check doesn\'t work. In\n # this case, the cache is a bit slower.\n@@ -218,8 +216,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n \n # Without a persistence jar, the _p_changed check doesn\'t work. In\n # this case, the cache is a bit slower.\n@@ -236,21 +234,13 @@ class ISchema(Interface):\n \n # Behaviors - one with a subtype and one without\n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n class IBehavior1(Interface):\n pass\n \n- behavior1 = BehaviorRegistration(\n- u"Behavior1",\n- "",\n- IBehavior1,\n- None,\n- None\n- )\n+ behavior1 = BehaviorRegistration(u"Behavior1", "", IBehavior1, None, None)\n self.mock_utility(behavior1, IBehavior, name="behavior1")\n \n class IBehavior2(Interface):\n@@ -259,19 +249,13 @@ class IBehavior2(Interface):\n class IMarker2(Interface):\n pass\n \n- behavior2 = BehaviorRegistration(\n- u"Behavior2",\n- "",\n- IBehavior2,\n- IMarker2,\n- None\n- )\n+ behavior2 = BehaviorRegistration(u"Behavior2", "", IBehavior2, IMarker2, None)\n self.mock_utility(behavior2, IBehavior, name="behavior2")\n \n # FTI mock\n fti_mock = Mock(wraps=DexterityFTI(u"testtype"))\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n- fti_mock.behaviors = [\'behavior1\', \'behavior2\']\n+ fti_mock.behaviors = ["behavior1", "behavior2"]\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n alsoProvides(fti_mock, IDexterityFTI)\n \n@@ -325,8 +309,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n \n # Without a persistence jar, the _p_changed check doesn\'t work. In\n # this case, the cache is a bit slower.\n@@ -345,13 +329,7 @@ class ISchema(Interface):\n class IBehavior1(Interface):\n pass\n \n- behavior1 = BehaviorRegistration(\n- u"Behavior1",\n- "",\n- IBehavior1,\n- None,\n- None\n- )\n+ behavior1 = BehaviorRegistration(u"Behavior1", "", IBehavior1, None, None)\n self.mock_utility(behavior1, IBehavior, name="behavior1")\n \n class IBehavior2(Interface):\n@@ -360,13 +338,7 @@ class IBehavior2(Interface):\n class IMarker2(Interface):\n pass\n \n- behavior2 = BehaviorRegistration(\n- u"Behavior2",\n- "",\n- IBehavior2,\n- IMarker2,\n- None\n- )\n+ behavior2 = BehaviorRegistration(u"Behavior2", "", IBehavior2, IMarker2, None)\n self.mock_utility(behavior2, IBehavior, name="behavior2")\n \n class IBehavior3(Interface):\n@@ -375,19 +347,11 @@ class IBehavior3(Interface):\n class IMarker3(Interface):\n pass\n \n- behavior3 = BehaviorRegistration(\n- u"Behavior3",\n- "",\n- IBehavior3,\n- IMarker3,\n- None\n- )\n+ behavior3 = BehaviorRegistration(u"Behavior3", "", IBehavior3, IMarker3, None)\n self.mock_utility(behavior3, IBehavior, name="behavior3")\n \n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n # FTI mock\n@@ -396,8 +360,8 @@ class IMarker3(Interface):\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # start clean\n- SCHEMA_CACHE.invalidate(\'testtype\')\n- fti_mock.behaviors = [\'behavior1\', \'behavior2\']\n+ SCHEMA_CACHE.invalidate("testtype")\n+ fti_mock.behaviors = ["behavior1", "behavior2"]\n \n # implementedBy does not look into the fti\n self.assertFalse(ISchema.implementedBy(MyItem))\n@@ -413,8 +377,8 @@ class IMarker3(Interface):\n \n # If we now invalidate the schema cache, we should get the\n # SECOND set of behaviors (which includes behavior3)\n- SCHEMA_CACHE.invalidate(\'testtype\')\n- fti_mock.behaviors = [\'behavior1\', \'behavior2\', \'behavior3\']\n+ SCHEMA_CACHE.invalidate("testtype")\n+ fti_mock.behaviors = ["behavior1", "behavior2", "behavior3"]\n \n # Main schema as looked up in FTI is now provided by item ...\n self.assertTrue(ISchema.providedBy(item))\n@@ -448,12 +412,12 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n self.assertEqual(u"foo_default", content.foo)\n self.assertEqual(None, content.bar)\n self.assertEqual(u"id", content.id)\n- self.assertRaises(AttributeError, getattr, content, \'baz\')\n+ self.assertRaises(AttributeError, getattr, content, "baz")\n \n def test_getattr_consults_schema_container(self):\n \n@@ -470,12 +434,12 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n self.assertEqual(u"foo_default", content.foo)\n self.assertEqual(None, content.bar)\n self.assertEqual(u"id", content.id)\n- self.assertRaises(AttributeError, getattr, content, \'baz\')\n+ self.assertRaises(AttributeError, getattr, content, "baz")\n \n def test_getattr_consults_schema_item_default_factory_with_context(self):\n \n@@ -491,8 +455,7 @@ def defaultFactory(context):\n return u"{0:s}_{1:s}".format(context.id, context.portal_type)\n \n class ISchema(Interface):\n- foo = zope.schema.TextLine(title=u"foo",\n- defaultFactory=defaultFactory)\n+ foo = zope.schema.TextLine(title=u"foo", defaultFactory=defaultFactory)\n bar = zope.schema.TextLine(title=u"bar")\n \n # FTI mock\n@@ -500,12 +463,12 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n self.assertEqual(u"id_testtype", content.foo)\n self.assertEqual(None, content.bar)\n self.assertEqual(u"id", content.id)\n- self.assertRaises(AttributeError, getattr, content, \'baz\')\n+ self.assertRaises(AttributeError, getattr, content, "baz")\n \n def test_getattr_on_container_returns_children(self):\n \n@@ -513,8 +476,8 @@ def test_getattr_on_container_returns_children(self):\n content.id = u"id"\n content.portal_type = u"testtype"\n \n- content[\'foo\'] = Item(\'foo\')\n- content[\'quux\'] = Item(\'quux\')\n+ content["foo"] = Item("foo")\n+ content["quux"] = Item("quux")\n \n class ISchema(Interface):\n foo = zope.schema.TextLine(title=u"foo", default=u"foo_default")\n@@ -525,30 +488,30 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n # Schema field masks contained item\n self.assertEqual(u"foo_default", content.foo)\n \n # But we can still obtain an item\n- self.assertTrue(isinstance(content[\'foo\'], Item))\n- self.assertEqual(\'foo\', content[\'foo\'].id)\n+ self.assertTrue(isinstance(content["foo"], Item))\n+ self.assertEqual("foo", content["foo"].id)\n \n # And if the item isn\'t masked by an attribute, we can still getattr it\n- self.assertTrue(isinstance(content[\'quux\'], Item))\n- self.assertEqual(\'quux\', content[\'quux\'].id)\n+ self.assertTrue(isinstance(content["quux"], Item))\n+ self.assertEqual("quux", content["quux"].id)\n \n- self.assertTrue(isinstance(getattr(content, \'quux\'), Item))\n- self.assertEqual(\'quux\', getattr(content, \'quux\').id)\n+ self.assertTrue(isinstance(getattr(content, "quux"), Item))\n+ self.assertEqual("quux", getattr(content, "quux").id)\n \n def test_ZMI_manage_options_container(self):\n # Make sure we get the expected tabs in the ZMI\n \n- containerOptions = [o[\'label\'] for o in Container.manage_options]\n+ containerOptions = [o["label"] for o in Container.manage_options]\n tabs = [\n- \'Security\',\n- \'Contents\',\n- \'Properties\',\n+ "Security",\n+ "Contents",\n+ "Properties",\n ]\n for tab in tabs:\n self.assertTrue(tab in containerOptions, "Tab %s not found" % tab)\n@@ -556,11 +519,11 @@ def test_ZMI_manage_options_container(self):\n def test_ZMI_manage_options_item(self):\n # Make sure we get the expected tabs in the ZMI\n \n- containerOptions = [o[\'label\'] for o in Item.manage_options]\n+ containerOptions = [o["label"] for o in Item.manage_options]\n tabs = [\n- \'Security\',\n- \'View\',\n- \'Properties\',\n+ "Security",\n+ "View",\n+ "Properties",\n ]\n for tab in tabs:\n self.assertTrue(tab in containerOptions, "Tab %s not found" % tab)\n@@ -568,35 +531,34 @@ def test_ZMI_manage_options_item(self):\n def test_name_and_id_in_sync(self):\n \n i = Item()\n- self.assertEqual(\'\', i.id)\n- self.assertEqual(\'\', i.getId())\n- self.assertEqual(u\'\', i.__name__)\n+ self.assertEqual("", i.id)\n+ self.assertEqual("", i.getId())\n+ self.assertEqual(u"", i.__name__)\n \n i = Item()\n i.id = "foo"\n- self.assertEqual(\'foo\', i.id)\n- self.assertEqual(\'foo\', i.getId())\n- self.assertEqual(u\'foo\', i.__name__)\n+ self.assertEqual("foo", i.id)\n+ self.assertEqual("foo", i.getId())\n+ self.assertEqual(u"foo", i.__name__)\n \n i = Item()\n i.__name__ = u"foo"\n- self.assertEqual(\'foo\', i.id)\n- self.assertEqual(\'foo\', i.getId())\n- self.assertEqual(u\'foo\', i.__name__)\n+ self.assertEqual("foo", i.id)\n+ self.assertEqual("foo", i.getId())\n+ self.assertEqual(u"foo", i.__name__)\n \n def test_name_unicode_id_str(self):\n \n i = Item()\n if six.PY2:\n try:\n- i.__name__ = b\'\\xc3\\xb8\'.decode(\'utf-8\')\n+ i.__name__ = b"\\xc3\\xb8".decode("utf-8")\n except UnicodeEncodeError:\n pass\n else:\n self.fail()\n else:\n- i.__name__ = b\'\\xc3\\xb8\'.decode(\'utf-8\')\n-\n+ i.__name__ = b"\\xc3\\xb8".decode("utf-8")\n \n i.__name__ = u"o"\n \n@@ -613,56 +575,53 @@ def test_item_dublincore(self):\n \n import plone.dexterity\n \n- datetime_patcher = patch.object(plone.dexterity.content, \'DateTime\')\n+ datetime_patcher = patch.object(plone.dexterity.content, "DateTime")\n mocked_datetime = datetime_patcher.start()\n mocked_datetime.return_value = DateTime(2014, 6, 1)\n self.addCleanup(datetime_patcher.stop)\n \n i = Item(\n title=u"Emperor Penguin",\n- description=u\'One of the most magnificent birds.\',\n- subject=u\'Penguins\',\n- contributors=u\'admin\',\n+ description=u"One of the most magnificent birds.",\n+ subject=u"Penguins",\n+ contributors=u"admin",\n effective_date="08/20/2010",\n expiration_date="07/09/2013",\n- format=\'text/plain\',\n- language=\'de\',\n- rights=\'CC\',\n+ format="text/plain",\n+ language="de",\n+ rights="CC",\n )\n \n summer_timezone = i.effective_date.timezone()\n self.assertEqual(i.title, u"Emperor Penguin")\n- self.assertEqual(i.Title(), \'Emperor Penguin\')\n- self.assertEqual(i.description, u\'One of the most magnificent birds.\')\n- self.assertEqual(i.Description(), \'One of the most magnificent birds.\')\n- self.assertEqual(i.subject, (u\'Penguins\',))\n- self.assertEqual(i.Subject(), (\'Penguins\',))\n- self.assertEqual(i.contributors, (u\'admin\',))\n- self.assertEqual(i.listContributors(), (\'admin\',))\n- self.assertEqual(i.Contributors(), (\'admin\',))\n- self.assertEqual(i.format, \'text/plain\')\n- self.assertEqual(i.effective_date, DateTime(\'08/20/2010\'))\n- self.assertEqual(\n- i.EffectiveDate(zone=summer_timezone)[:10], \'2010-08-20\')\n- self.assertEqual(i.effective(), DateTime(\'08/20/2010\'))\n- self.assertEqual(i.expiration_date, DateTime(\'07/09/2013\'))\n- self.assertEqual(\n- i.ExpirationDate(zone=summer_timezone)[:10], \'2013-07-09\')\n- self.assertEqual(i.expires(), DateTime(\'07/09/2013\'))\n- self.assertEqual(i.language, \'de\')\n- self.assertEqual(i.Language(), \'de\')\n- self.assertEqual(i.rights, \'CC\')\n- self.assertEqual(i.Rights(), \'CC\')\n+ self.assertEqual(i.Title(), "Emperor Penguin")\n+ self.assertEqual(i.description, u"One of the most magnificent birds.")\n+ self.assertEqual(i.Description(), "One of the most magnificent birds.")\n+ self.assertEqual(i.subject, (u"Penguins",))\n+ self.assertEqual(i.Subject(), ("Penguins",))\n+ self.assertEqual(i.contributors, (u"admin",))\n+ self.assertEqual(i.listContributors(), ("admin",))\n+ self.assertEqual(i.Contributors(), ("admin",))\n+ self.assertEqual(i.format, "text/plain")\n+ self.assertEqual(i.effective_date, DateTime("08/20/2010"))\n+ self.assertEqual(i.EffectiveDate(zone=summer_timezone)[:10], "2010-08-20")\n+ self.assertEqual(i.effective(), DateTime("08/20/2010"))\n+ self.assertEqual(i.expiration_date, DateTime("07/09/2013"))\n+ self.assertEqual(i.ExpirationDate(zone=summer_timezone)[:10], "2013-07-09")\n+ self.assertEqual(i.expires(), DateTime("07/09/2013"))\n+ self.assertEqual(i.language, "de")\n+ self.assertEqual(i.Language(), "de")\n+ self.assertEqual(i.rights, "CC")\n+ self.assertEqual(i.Rights(), "CC")\n self.assertEqual(i.creation_date, i.created())\n self.assertEqual(\n- i.CreationDate(zone=summer_timezone)[:19],\n- i.creation_date.ISO()[:19]\n+ i.CreationDate(zone=summer_timezone)[:19], i.creation_date.ISO()[:19]\n )\n self.assertEqual(i.modification_date, i.creation_date)\n self.assertEqual(i.modification_date, i.modified())\n self.assertEqual(\n i.ModificationDate(zone=summer_timezone)[:19],\n- i.modification_date.ISO()[:19]\n+ i.modification_date.ISO()[:19],\n )\n self.assertEqual(i.Date(), i.EffectiveDate())\n self.assertEqual(i.Identifier(), i.absolute_url())\n@@ -671,42 +630,40 @@ def test_item_dublincore_date(self):\n from DateTime import DateTime\n \n import plone.dexterity\n- datetime_patcher = patch.object(plone.dexterity.content, \'DateTime\')\n+\n+ datetime_patcher = patch.object(plone.dexterity.content, "DateTime")\n mocked_datetime = datetime_patcher.start()\n mocked_datetime.return_value = DateTime(2014, 6, 1)\n self.addCleanup(datetime_patcher.stop)\n \n i = Item(\n title=u"Emperor Penguin",\n- description=u\'One of the most magnificent birds.\',\n- subject=u\'Penguins\',\n- contributors=u\'admin\',\n+ description=u"One of the most magnificent birds.",\n+ subject=u"Penguins",\n+ contributors=u"admin",\n effective_date=date(2010, 8, 20),\n expiration_date=date(2013, 7, 9),\n- format=\'text/plain\',\n- language=\'de\',\n- rights=\'CC\',\n+ format="text/plain",\n+ language="de",\n+ rights="CC",\n )\n \n- summer_timezone = DateTime(\'2010/08/20\').timezone()\n- self.assertEqual(i.effective_date, DateTime(\'08/20/2010\'))\n- self.assertEqual(\n- i.EffectiveDate(zone=summer_timezone)[:10], \'2010-08-20\')\n- self.assertEqual(i.effective(), DateTime(\'08/20/2010\'))\n- self.assertEqual(i.expiration_date, DateTime(\'07/09/2013\'))\n- self.assertEqual(\n- i.ExpirationDate(zone=summer_timezone)[:10], \'2013-07-09\')\n- self.assertEqual(i.expires(), DateTime(\'07/09/2013\'))\n+ summer_timezone = DateTime("2010/08/20").timezone()\n+ self.assertEqual(i.effective_date, DateTime("08/20/2010"))\n+ self.assertEqual(i.EffectiveDate(zone=summer_timezone)[:10], "2010-08-20")\n+ self.assertEqual(i.effective(), DateTime("08/20/2010"))\n+ self.assertEqual(i.expiration_date, DateTime("07/09/2013"))\n+ self.assertEqual(i.ExpirationDate(zone=summer_timezone)[:10], "2013-07-09")\n+ self.assertEqual(i.expires(), DateTime("07/09/2013"))\n self.assertEqual(i.creation_date, i.created())\n self.assertEqual(\n- i.CreationDate(zone=summer_timezone)[:19],\n- i.creation_date.ISO()[:19]\n+ i.CreationDate(zone=summer_timezone)[:19], i.creation_date.ISO()[:19]\n )\n self.assertEqual(i.modification_date, i.creation_date)\n self.assertEqual(i.modification_date, i.modified())\n self.assertEqual(\n i.ModificationDate(zone=summer_timezone)[:19],\n- i.modification_date.ISO()[:19]\n+ i.modification_date.ISO()[:19],\n )\n self.assertEqual(i.Date(), i.EffectiveDate())\n \n@@ -714,67 +671,42 @@ def test_item_dublincore_datetime(self):\n from DateTime import DateTime\n \n import plone.dexterity\n- datetime_patcher = patch.object(plone.dexterity.content, \'DateTime\')\n+\n+ datetime_patcher = patch.object(plone.dexterity.content, "DateTime")\n mocked_datetime = datetime_patcher.start()\n mocked_datetime.return_value = DateTime(2014, 6, 1)\n self.addCleanup(datetime_patcher.stop)\n i = Item(\n title=u"Emperor Penguin",\n- description=u\'One of the most magnificent birds.\',\n- subject=u\'Penguins\',\n- contributors=u\'admin\',\n- effective_date=datetime(\n- 2010, 8, 20, 12, 59, 59, 0, timezone(\'US/Eastern\')),\n- expiration_date=datetime(\n- 2013, 7, 9, 12, 59, 59, 0, timezone(\'US/Eastern\')),\n- format=\'text/plain\',\n- language=\'de\',\n- rights=\'CC\',\n+ description=u"One of the most magnificent birds.",\n+ subject=u"Penguins",\n+ contributors=u"admin",\n+ effective_date=datetime(2010, 8, 20, 12, 59, 59, 0, timezone("US/Eastern")),\n+ expiration_date=datetime(2013, 7, 9, 12, 59, 59, 0, timezone("US/Eastern")),\n+ format="text/plain",\n+ language="de",\n+ rights="CC",\n )\n \n- summer_timezone = DateTime(\'2010/08/20\').timezone()\n- self.assertEqual(\n- i.effective_date,\n- DateTime(\'2010/08/20 12:59:59 US/Eastern\')\n- )\n+ summer_timezone = DateTime("2010/08/20").timezone()\n+ self.assertEqual(i.effective_date, DateTime("2010/08/20 12:59:59 US/Eastern"))\n self.assertEqual(\n i.EffectiveDate(zone=summer_timezone),\n- DateTime(\n- \'2010/08/20 12:59:59 US/Eastern\'\n- ).toZone(\n- summer_timezone\n- ).ISO()\n- )\n- self.assertEqual(\n- i.effective(),\n- DateTime(\'2010/08/20 12:59:59 US/Eastern\')\n- )\n- self.assertEqual(\n- i.expiration_date,\n- DateTime(\'07/09/2013 12:59:59 US/Eastern\')\n+ DateTime("2010/08/20 12:59:59 US/Eastern").toZone(summer_timezone).ISO(),\n )\n+ self.assertEqual(i.effective(), DateTime("2010/08/20 12:59:59 US/Eastern"))\n+ self.assertEqual(i.expiration_date, DateTime("07/09/2013 12:59:59 US/Eastern"))\n self.assertEqual(\n i.ExpirationDate(zone=summer_timezone),\n- DateTime(\n- \'2013-07-09 12:59:59 US/Eastern\'\n- ).toZone(\n- summer_timezone\n- ).ISO()\n- )\n- self.assertEqual(\n- i.expires(),\n- DateTime(\'2013/07/09 12:59:59 US/Eastern\')\n+ DateTime("2013-07-09 12:59:59 US/Eastern").toZone(summer_timezone).ISO(),\n )\n+ self.assertEqual(i.expires(), DateTime("2013/07/09 12:59:59 US/Eastern"))\n self.assertEqual(i.creation_date, i.created())\n- self.assertEqual(\n- i.CreationDate(zone=summer_timezone),\n- i.creation_date.ISO()\n- )\n+ self.assertEqual(i.CreationDate(zone=summer_timezone), i.creation_date.ISO())\n self.assertEqual(i.modification_date, i.creation_date)\n self.assertEqual(i.modification_date, i.modified())\n self.assertEqual(\n- i.ModificationDate(zone=summer_timezone),\n- i.modification_date.ISO()\n+ i.ModificationDate(zone=summer_timezone), i.modification_date.ISO()\n )\n self.assertEqual(i.Date(), i.EffectiveDate())\n \n@@ -783,6 +715,7 @@ def test_item_notifyModified(self):\n \n def mock_addCreator():\n mock_addCreator.called = True\n+\n i.addCreator = mock_addCreator\n \n i.setModificationDate(DateTime(0))\n@@ -794,10 +727,10 @@ def mock_addCreator():\n \n def test_item_addCreator(self):\n i = Item()\n- i.addCreator(u\'harvey\')\n- self.assertEqual(i.creators, (u\'harvey\',))\n- self.assertEqual(i.listCreators(), (u\'harvey\',))\n- self.assertEqual(i.Creator(), \'harvey\')\n+ i.addCreator(u"harvey")\n+ self.assertEqual(i.creators, (u"harvey",))\n+ self.assertEqual(i.listCreators(), (u"harvey",))\n+ self.assertEqual(i.Creator(), "harvey")\n \n def test_item_Type(self):\n i = Item()\n@@ -805,11 +738,13 @@ def test_item_Type(self):\n def mock_getTypeInfo():\n class TypeInfo(object):\n def Title(self):\n- return \'Foo\'\n+ return "Foo"\n+\n return TypeInfo()\n+\n i.getTypeInfo = mock_getTypeInfo\n \n- self.assertEqual(i.Type(), \'Foo\')\n+ self.assertEqual(i.Type(), "Foo")\n \n def test_item_init_nondc_kwargs(self):\n i = Item(foo="bar")\n@@ -817,11 +752,8 @@ def test_item_init_nondc_kwargs(self):\n \n def test_container_init_dublincore(self):\n from DateTime.DateTime import DateTime\n- c = Container(\n- title=u"Test title",\n- language="en",\n- effective_date="2010-08-20"\n- )\n+\n+ c = Container(title=u"Test title", language="en", effective_date="2010-08-20")\n self.assertEqual(c.title, u"Test title")\n self.assertEqual(c.language, "en")\n self.assertTrue(isinstance(c.effective_date, DateTime))\n@@ -857,9 +789,9 @@ def test_Title_converts_to_utf8(self):\n \n def test_Title_handles_None(self):\n i = Item(title=None)\n- self.assertEqual(\'\', i.Title())\n+ self.assertEqual("", i.Title())\n c = Container(title=None)\n- self.assertEqual(\'\', c.Title())\n+ self.assertEqual("", c.Title())\n \n def test_Creator_converts_to_utf8(self):\n i = Item()\n@@ -874,9 +806,9 @@ def test_Creator_converts_to_utf8(self):\n \n def test_Creator_handles_None(self):\n i = Item(creators=None)\n- self.assertEqual(\'\', i.Creator())\n+ self.assertEqual("", i.Creator())\n c = Container(creators=None)\n- self.assertEqual(\'\', c.Creator())\n+ self.assertEqual("", c.Creator())\n \n def test_Description_converts_to_utf8(self):\n i = Item()\n@@ -904,14 +836,14 @@ def test_setDescription_converts_to_unicode(self):\n \n def test_Description_handles_None(self):\n i = Item(description=None)\n- self.assertEqual(\'\', i.Description())\n+ self.assertEqual("", i.Description())\n c = Container(description=None)\n- self.assertEqual(\'\', c.Description())\n+ self.assertEqual("", c.Description())\n \n def test_Description_removes_newlines(self):\n i = Item()\n- i.description = u\'foo\\r\\nbar\\nbaz\\r\'\n- self.assertEqual(\'foo bar baz \', i.Description())\n+ i.description = u"foo\\r\\nbar\\nbaz\\r"\n+ self.assertEqual("foo bar baz ", i.Description())\n \n def test_Subject_converts_to_utf8(self):\n i = Item()\n@@ -960,16 +892,16 @@ def register(self, obj):\n pass\n \n # Dummy instances\n- foo = Item(id=u\'foo\')\n- foo.portal_type = \'testtype\'\n+ foo = Item(id=u"foo")\n+ foo.portal_type = "testtype"\n foo._p_jar = FauxDataManager()\n \n- bar = Item(id=u\'bar\')\n- bar.portal_type = \'testtype\'\n+ bar = Item(id=u"bar")\n+ bar.portal_type = "testtype"\n bar._p_jar = FauxDataManager()\n \n- baz = Container(id=u\'baz\')\n- baz.portal_type = \'testtype\'\n+ baz = Container(id=u"baz")\n+ baz.portal_type = "testtype"\n baz._p_jar = FauxDataManager()\n \n # Dummy schema\n@@ -995,30 +927,30 @@ class ISchema(Interface):\n def test_container_manage_delObjects(self):\n # OFS does not check the delete permission for each object being\n # deleted. We want to.\n- item = Item(id=\'test\')\n- container = Container(id=\'testcontainer\')\n- container[\'test\'] = item\n+ item = Item(id="test")\n+ container = Container(id="testcontainer")\n+ container["test"] = item\n # self.layer[\'portal\'][\'testcontainer\'] = container\n from zExceptions import Unauthorized\n- self.assertRaises(Unauthorized, container.manage_delObjects, [\'test\'])\n+\n+ self.assertRaises(Unauthorized, container.manage_delObjects, ["test"])\n \n # Now permit it and try again.\n from Products.CMFCore.permissions import DeleteObjects\n+\n # in order to use manage_permissions the permission has to be defined\n # somewhere in the mro\n # since webdav is no longer part here, where it was defined in ZServer.\n # lets add it explicit here.\n perms_before = item.__class__.__ac_permissions__\n item.__class__.__ac_permissions__ = ((DeleteObjects, ()),)\n- item.manage_permission(DeleteObjects, (\'Anonymous\',))\n- container.manage_delObjects([\'test\'])\n- self.assertFalse(\'test\' in container)\n+ item.manage_permission(DeleteObjects, ("Anonymous",))\n+ container.manage_delObjects(["test"])\n+ self.assertFalse("test" in container)\n item.__class__.__ac_permissions__ = perms_before\n \n def test_iconstraintypes_adapter(self):\n-\n class DummyConstrainTypes(object):\n-\n def __init__(self, context):\n self.context = context\n \n@@ -1026,8 +958,7 @@ def allowedContentTypes(self):\n fti = getUtility(IDexterityFTI, name=u"testtype")\n return [fti]\n \n- self.mock_adapter(\n- DummyConstrainTypes, IConstrainTypes, (IDexterityContainer, ))\n+ self.mock_adapter(DummyConstrainTypes, IConstrainTypes, (IDexterityContainer,))\n \n # FTI mock\n fti_mock = Mock(wraps=DexterityFTI(u"testtype"))\n@@ -1037,75 +968,69 @@ def allowedContentTypes(self):\n \n self.assertEqual(folder.allowedContentTypes(), [fti_mock])\n self.assertRaises(\n- ValueError,\n- folder.invokeFactory,\n- u"disallowed_type",\n- id="test"\n+ ValueError, folder.invokeFactory, u"disallowed_type", id="test"\n )\n \n def test_verifyObjectPaste_paste_without_portal_type(self):\n- original_container = Container(id=\'parent\')\n- original_container.manage_permission(\'View\', (\'Anonymous\',))\n- content = Item(id=\'test\')\n- content.__factory_meta_type__ = \'document\'\n- container = Container(id=\'container\')\n- container.all_meta_types = [{\'name\': \'document\',\n- \'action\': None,\n- \'permission\': \'View\'}]\n- container.manage_permission(\'View\', (\'Anonymous\',))\n- container[\'test\'] = content\n- content = container[\'test\']\n+ original_container = Container(id="parent")\n+ original_container.manage_permission("View", ("Anonymous",))\n+ content = Item(id="test")\n+ content.__factory_meta_type__ = "document"\n+ container = Container(id="container")\n+ container.all_meta_types = [\n+ {"name": "document", "action": None, "permission": "View"}\n+ ]\n+ container.manage_permission("View", ("Anonymous",))\n+ container["test"] = content\n+ content = container["test"]\n container._verifyObjectPaste(content, True)\n \n def test_verifyObjectPaste_fti_does_not_allow_content(self):\n from Products.CMFCore.interfaces import ITypeInformation\n- original_container = Container(id=\'parent\')\n- original_container.manage_permission(\'View\', (\'Anonymous\',))\n- content = Item(id=\'test\')\n- content.__factory_meta_type__ = \'document\'\n- content.portal_type = \'document\'\n- container = Container(id=\'container\')\n- container.all_meta_types = [{\'name\': \'document\',\n- \'action\': None,\n- \'permission\': \'View\'}]\n- container.manage_permission(\'View\', (\'Anonymous\',))\n- container[\'test\'] = content\n- content = container[\'test\']\n+\n+ original_container = Container(id="parent")\n+ original_container.manage_permission("View", ("Anonymous",))\n+ content = Item(id="test")\n+ content.__factory_meta_type__ = "document"\n+ content.portal_type = "document"\n+ container = Container(id="container")\n+ container.all_meta_types = [\n+ {"name": "document", "action": None, "permission": "View"}\n+ ]\n+ container.manage_permission("View", ("Anonymous",))\n+ container["test"] = content\n+ content = container["test"]\n fti_mock = Mock()\n fti_mock.isConstructionAllowed = Mock(return_value=False)\n- self.mock_utility(fti_mock, ITypeInformation, name=\'document\')\n+ self.mock_utility(fti_mock, ITypeInformation, name="document")\n mock_pt = Mock()\n mock_pt.getTypeInfo = Mock(return_value=None)\n- self.mock_tool(mock_pt, \'portal_types\')\n+ self.mock_tool(mock_pt, "portal_types")\n self.mock_utility(mock_pt, ITypesTool)\n \n- self.assertRaises(\n- ValueError,\n- container._verifyObjectPaste,\n- content,\n- True\n- )\n+ self.assertRaises(ValueError, container._verifyObjectPaste, content, True)\n \n def test_verifyObjectPaste_fti_does_allow_content(self):\n from Products.CMFCore.interfaces import ITypeInformation\n- original_container = Container(id=\'parent\')\n- original_container.manage_permission(\'View\', (\'Anonymous\',))\n- content = Item(id=\'test\')\n- content.__factory_meta_type__ = \'document\'\n- content.portal_type = \'document\'\n- container = Container(id=\'container\')\n- container.all_meta_types = [{\'name\': \'document\',\n- \'action\': None,\n- \'permission\': \'View\'}]\n- container.manage_permission(\'View\', (\'Anonymous\',))\n- container[\'test\'] = content\n- content = container[\'test\']\n+\n+ original_container = Container(id="parent")\n+ original_container.manage_permission("View", ("Anonymous",))\n+ content = Item(id="test")\n+ content.__factory_meta_type__ = "document"\n+ content.portal_type = "document"\n+ container = Container(id="container")\n+ container.all_meta_types = [\n+ {"name": "document", "action": None, "permission": "View"}\n+ ]\n+ container.manage_permission("View", ("Anonymous",))\n+ container["test"] = content\n+ content = container["test"]\n mock_fti = Mock()\n mock_fti.isConstructionAllowed = Mock(return_value=True)\n- self.mock_utility(mock_fti, ITypeInformation, name=\'document\')\n+ self.mock_utility(mock_fti, ITypeInformation, name="document")\n mock_pt = Mock()\n mock_pt.getTypeInfo = Mock(return_value=None)\n- self.mock_tool(mock_pt, \'portal_types\')\n+ self.mock_tool(mock_pt, "portal_types")\n self.mock_utility(mock_pt, ITypesTool)\n \n container._verifyObjectPaste(content, True)\n@@ -1120,31 +1045,26 @@ class ITest(Interface):\n \n class ITestBehavior(Interface):\n field2 = zope.schema.TextLine()\n+\n alsoProvides(ITestBehavior, IFormFieldProvider)\n \n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n- fti_mock.behaviors = [\'test_behavior\']\n+ fti_mock.behaviors = ["test_behavior"]\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n behavior_reg = BehaviorRegistration(\n- u"Test Behavior",\n- "",\n- ITestBehavior,\n- ITestBehavior,\n- None\n+ u"Test Behavior", "", ITestBehavior, ITestBehavior, None\n )\n self.mock_utility(behavior_reg, IBehavior, name="test_behavior")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n- item.field1 = SizedValue(\'1\')\n- item.field2 = SizedValue(\'22\')\n+ item = Item("item")\n+ item.portal_type = "testtype"\n+ item.field1 = SizedValue("1")\n+ item.field2 = SizedValue("22")\n \n self.assertEqual(3, item.getSize())\ndiff --git a/plone/dexterity/tests/test_content_integration.py b/plone/dexterity/tests/test_content_integration.py\nindex d2cb8f3..9291798 100644\n--- a/plone/dexterity/tests/test_content_integration.py\n+++ b/plone/dexterity/tests/test_content_integration.py\n@@ -14,13 +14,13 @@ class TestUUIDIntegration(unittest.TestCase):\n layer = UNIT_TESTING\n \n def setUp(self):\n- import zope.component.testing\n- import plone.uuid\n-\n from zope.configuration import xmlconfig\n \n+ import plone.uuid\n+ import zope.component.testing\n+\n zope.component.testing.setUp()\n- xmlconfig.file(\'configure.zcml\', plone.uuid)\n+ xmlconfig.file("configure.zcml", plone.uuid)\n \n def test_uuid_assigned_on_creation(self):\n from plone.dexterity.content import Item\ndiff --git a/plone/dexterity/tests/test_exportimport.py b/plone/dexterity/tests/test_exportimport.py\nindex 0194037..97cd983 100644\n--- a/plone/dexterity/tests/test_exportimport.py\n+++ b/plone/dexterity/tests/test_exportimport.py\n@@ -3,43 +3,41 @@\n \n \n class ExportImportTests(unittest.TestCase):\n-\n def test_export(self):\n # Make sure our exporter delegates to manage_FTPget()\n from plone.dexterity.content import Item\n- from plone.dexterity.exportimport import \\\n- DexterityContentExporterImporter\n+ from plone.dexterity.exportimport import DexterityContentExporterImporter\n from Products.GenericSetup.tests.common import DummyExportContext\n \n class DummyItem(Item):\n def manage_FTPget(self):\n- return \'title: Foo\'\n- item = DummyItem(\'test\')\n+ return "title: Foo"\n+\n+ item = DummyItem("test")\n \n export_context = DummyExportContext(None)\n exporter = DexterityContentExporterImporter(item)\n exporter.export(export_context, subdir=None, root=True)\n \n self.assertEqual(\n- export_context._wrote[-1],\n- (\'.data\', \'title: Foo\', \'text/plain\')\n+ export_context._wrote[-1], (".data", "title: Foo", "text/plain")\n )\n \n def test_import(self):\n # Make sure our importer delegates to PUT()\n from plone.dexterity.content import Item\n- from plone.dexterity.exportimport import \\\n- DexterityContentExporterImporter\n+ from plone.dexterity.exportimport import DexterityContentExporterImporter\n from Products.GenericSetup.tests.common import DummyImportContext\n \n class DummyItem(Item):\n def PUT(self, request, response):\n- self.title = \'Foo\'\n- item = DummyItem(\'test\')\n+ self.title = "Foo"\n+\n+ item = DummyItem("test")\n \n import_context = DummyImportContext(None)\n- import_context._files[\'.data\'] = b\'title: Foo\'\n+ import_context._files[".data"] = b"title: Foo"\n importer = DexterityContentExporterImporter(item)\n importer.import_(import_context, None, root=True)\n \n- self.assertEqual(\'Foo\', item.Title())\n+ self.assertEqual("Foo", item.Title())\ndiff --git a/plone/dexterity/tests/test_factory.py b/plone/dexterity/tests/test_factory.py\nindex f8621b2..df35690 100644\n--- a/plone/dexterity/tests/test_factory.py\n+++ b/plone/dexterity/tests/test_factory.py\n@@ -11,21 +11,21 @@\n except ImportError:\n from mock import Mock\n \n+\n class IDummy(Interface):\n pass\n \n \n class TestFactory(MockTestCase):\n-\n def test_title(self):\n- fti_mock = Mock(spec=DexterityFTI, title=\'Mock type\')\n+ fti_mock = Mock(spec=DexterityFTI, title="Mock type")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual("Mock type", factory.title)\n \n def test_description(self):\n- fti_mock = Mock(spec=DexterityFTI, description=\'Mock type description\')\n+ fti_mock = Mock(spec=DexterityFTI, description="Mock type description")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n factory = DexterityFactory(portal_type=u"testtype")\n@@ -52,17 +52,18 @@ def test_get_interfaces(self):\n def test_create_with_schema_already_provided_and_portal_type_set(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=u\'testtype\')\n+ obj_mock = Mock(portal_type=u"testtype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n- fti_mock = Mock(spec=DexterityFTI, klass=\'my.mocked.ContentTypeClass\')\n+ fti_mock = Mock(spec=DexterityFTI, klass="my.mocked.ContentTypeClass")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n factory = DexterityFactory(portal_type=u"testtype")\n@@ -78,6 +79,7 @@ def test_create_sets_portal_type_if_not_set(self):\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -87,18 +89,19 @@ def test_create_sets_portal_type_if_not_set(self):\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual(obj_mock, factory())\n- self.assertEqual(obj_mock.portal_type, u\'testtype\')\n+ self.assertEqual(obj_mock.portal_type, u"testtype")\n \n def test_create_sets_portal_type_if_wrong(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=\'othertype\')\n+ obj_mock = Mock(portal_type="othertype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -108,18 +111,19 @@ def test_create_sets_portal_type_if_wrong(self):\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual(obj_mock, factory())\n- self.assertEqual(obj_mock.portal_type, u\'testtype\')\n+ self.assertEqual(obj_mock.portal_type, u"testtype")\n \n def test_create_initialises_schema_if_not_provided(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=u\'testtype\')\n+ obj_mock = Mock(portal_type=u"testtype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -133,13 +137,14 @@ def test_create_initialises_schema_if_not_provided(self):\n def test_factory_passes_args_and_kwargs(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=u\'testtype\')\n+ obj_mock = Mock(portal_type=u"testtype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -149,4 +154,4 @@ def test_factory_passes_args_and_kwargs(self):\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual(obj_mock, factory(u"id", title=u"title"))\n- klass_mock.assert_called_once_with(u\'id\', title=u\'title\')\n+ klass_mock.assert_called_once_with(u"id", title=u"title")\ndiff --git a/plone/dexterity/tests/test_fti.py b/plone/dexterity/tests/test_fti.py\nindex 018587f..da1e61f 100644\n--- a/plone/dexterity/tests/test_fti.py\n+++ b/plone/dexterity/tests/test_fti.py\n@@ -1,7 +1,6 @@\n # -*- coding: utf-8 -*-\n from .case import MockTestCase\n from plone.dexterity import utils\n-from plone.dexterity.schema import portalTypeToSchemaName\n from plone.dexterity.factory import DexterityFactory\n from plone.dexterity.fti import DexterityFTI\n from plone.dexterity.fti import DexterityFTIModificationDescription\n@@ -11,6 +10,7 @@\n from plone.dexterity.fti import ftiRenamed\n from plone.dexterity.interfaces import IDexterityFTI\n from plone.dexterity.schema import DexteritySchemaPolicy\n+from plone.dexterity.schema import portalTypeToSchemaName\n from plone.dexterity.tests.schemata import ITestSchema\n from plone.supermodel.model import Model\n from Products.CMFCore.interfaces import ISiteRoot\n@@ -52,7 +52,6 @@ class ITestInterface(Interface):\n \n \n class TestFTI(MockTestCase):\n-\n def test_factory_name_is_fti_id(self):\n fti = DexterityFTI(u"testtype")\n self.assertEqual(u"testtype", fti.getId())\n@@ -76,7 +75,7 @@ def test_lookupSchema_with_dynamic_schema(self):\n fti = DexterityFTI(u"testtype")\n fti.schema = None # use dynamic schema\n \n- portal = self.create_dummy(getPhysicalPath=lambda: (\'\', \'site\'))\n+ portal = self.create_dummy(getPhysicalPath=lambda: ("", "site"))\n self.mock_utility(portal, ISiteRoot)\n \n schemaName = portalTypeToSchemaName(fti.getId())\n@@ -88,12 +87,12 @@ def test_lookupSchema_with_dynamic_schema(self):\n delattr(plone.dexterity.schema.generated, schemaName)\n \n def test_lookupSchema_with_nonexistant_schema(self):\n- """ Tests the case where a dexterity type is not removed cleanly\n+ """Tests the case where a dexterity type is not removed cleanly\n from the fti, but the code has been removed.\n """\n fti = DexterityFTI(u"testtype")\n- fti.schema = \'model.wont.be.imported\'\n- portal = self.create_dummy(getPhysicalPath=lambda: (\'\', \'site\'))\n+ fti.schema = "model.wont.be.imported"\n+ portal = self.create_dummy(getPhysicalPath=lambda: ("", "site"))\n self.mock_utility(portal, ISiteRoot)\n schemaName = portalTypeToSchemaName(fti.getId())\n setattr(plone.dexterity.schema.generated, schemaName, ITestSchema)\n@@ -109,6 +108,7 @@ def test_lookupModel_from_string(self):\n model_dummy = Model()\n \n from plone.supermodel import loadString\n+\n self.patch_global(loadString, return_value=model_dummy)\n \n model = fti.lookupModel()\n@@ -124,25 +124,27 @@ def test_lookupModel_from_file_with_package(self):\n model_dummy = Model()\n \n import plone.dexterity.tests\n+\n abs_file = os.path.join(\n- os.path.split(plone.dexterity.tests.__file__)[0],\n- "test.xml"\n+ os.path.split(plone.dexterity.tests.__file__)[0], "test.xml"\n )\n \n from plone.supermodel import loadFile\n+\n loadFile_mock = self.patch_global(loadFile, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n loadFile_mock.assert_called_once_with(\n- abs_file, reload=True, policy=u"dexterity")\n+ abs_file, reload=True, policy=u"dexterity"\n+ )\n \n def test_lookupModel_from_file_with_absolute_path(self):\n \n import plone.dexterity.tests\n+\n abs_file = os.path.join(\n- os.path.split(plone.dexterity.tests.__file__)[0],\n- "test.xml"\n+ os.path.split(plone.dexterity.tests.__file__)[0], "test.xml"\n )\n \n fti = DexterityFTI(u"testtype")\n@@ -153,12 +155,14 @@ def test_lookupModel_from_file_with_absolute_path(self):\n model_dummy = Model()\n \n from plone.supermodel import loadFile\n+\n loadFile_mock = self.patch_global(loadFile, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n loadFile_mock.assert_called_once_with(\n- abs_file, reload=True, policy=u"dexterity")\n+ abs_file, reload=True, policy=u"dexterity"\n+ )\n \n def test_lookupModel_from_file_with_win32_absolute_path(self):\n \n@@ -169,17 +173,21 @@ def test_lookupModel_from_file_with_win32_absolute_path(self):\n \n model_dummy = Model()\n \n- from os.path import isabs, isfile\n+ from os.path import isabs\n+ from os.path import isfile\n+\n self.patch_global(isabs, return_value=True)\n self.patch_global(isfile, return_value=True)\n \n from plone.supermodel import loadFile\n+\n loadFile_mock = self.patch_global(loadFile, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n loadFile_mock.assert_called_once_with(\n- fti.model_file, reload=True, policy=u"dexterity")\n+ fti.model_file, reload=True, policy=u"dexterity"\n+ )\n \n def test_lookupModel_with_schema_only(self):\n fti = DexterityFTI(u"testtype")\n@@ -201,14 +209,13 @@ def test_lookupModel_from_string_with_schema(self):\n model_dummy = Model()\n \n from plone.supermodel import loadString\n- loadString_mock = self.patch_global(\n- loadString, return_value=model_dummy)\n+\n+ loadString_mock = self.patch_global(loadString, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n self.assertIs(ITestSchema, fti.lookupSchema())\n- loadString_mock.assert_called_once_with(\n- fti.model_source, policy=u\'dexterity\')\n+ loadString_mock.assert_called_once_with(fti.model_source, policy=u"dexterity")\n \n def test_lookupModel_failure(self):\n fti = DexterityFTI(u"testtype")\n@@ -225,16 +232,17 @@ def test_fires_modified_event_on_update_property_if_changed(self):\n fti.global_allow = False\n \n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n- fti._updateProperty(\'title\', "New title") # fires event caught above\n- fti._updateProperty(\'allow_discussion\', False) # does not fire\n+ fti._updateProperty("title", "New title") # fires event caught above\n+ fti._updateProperty("allow_discussion", False) # does not fire\n \n event = notify_mock.call_args[0][0]\n self.assertTrue(IObjectModifiedEvent.providedBy(event))\n self.assertEqual(len(event.descriptions), 1)\n- self.assertEqual(event.descriptions[0].attribute, \'title\')\n- self.assertEqual(event.descriptions[0].oldValue, \'Old title\')\n+ self.assertEqual(event.descriptions[0].attribute, "title")\n+ self.assertEqual(event.descriptions[0].oldValue, "Old title")\n \n def test_fires_modified_event_on_change_props_per_changed_property(self):\n fti = DexterityFTI(u"testtype")\n@@ -243,12 +251,11 @@ def test_fires_modified_event_on_change_props_per_changed_property(self):\n fti.global_allow = True\n \n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n fti.manage_changeProperties(\n- title="New title",\n- allow_discussion=False,\n- global_allow=False\n+ title="New title", allow_discussion=False, global_allow=False\n )\n \n self.assertEqual(len(notify_mock.call_args_list), 2)\n@@ -259,24 +266,21 @@ def test_checks_permission_in_is_construction_allowed_true(self):\n container_dummy = self.create_dummy()\n \n permission_dummy = self.create_dummy()\n- permission_dummy.id = \'demo.Permission\'\n- permission_dummy.title = \'Some add permission\'\n+ permission_dummy.id = "demo.Permission"\n+ permission_dummy.title = "Some add permission"\n \n- self.mock_utility(\n- permission_dummy,\n- IPermission,\n- name=u"demo.Permission"\n- )\n+ self.mock_utility(permission_dummy, IPermission, name=u"demo.Permission")\n \n security_manager_mock = Mock()\n security_manager_mock.checkPermission = Mock(return_value=True)\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n self.assertEqual(True, fti.isConstructionAllowed(container_dummy))\n security_manager_mock.checkPermission.assert_called_once_with(\n- \'Some add permission\', container_dummy)\n+ "Some add permission", container_dummy\n+ )\n \n def test_checks_permission_in_is_construction_allowed_false(self):\n fti = DexterityFTI(u"testtype")\n@@ -284,28 +288,25 @@ def test_checks_permission_in_is_construction_allowed_false(self):\n container_dummy = self.create_dummy()\n \n permission_dummy = self.create_dummy()\n- permission_dummy.id = \'demo.Permission\'\n- permission_dummy.title = \'Some add permission\'\n+ permission_dummy.id = "demo.Permission"\n+ permission_dummy.title = "Some add permission"\n \n- self.mock_utility(\n- permission_dummy,\n- IPermission,\n- name=u"demo.Permission"\n- )\n+ self.mock_utility(permission_dummy, IPermission, name=u"demo.Permission")\n \n security_manager_mock = Mock()\n security_manager_mock.checkPermission = Mock(return_value=False)\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n self.assertEqual(False, fti.isConstructionAllowed(container_dummy))\n security_manager_mock.checkPermission.assert_called_once_with(\n- \'Some add permission\', container_dummy)\n+ "Some add permission", container_dummy\n+ )\n \n def test_no_permission_utility_means_no_construction(self):\n fti = DexterityFTI(u"testtype")\n- fti.add_permission = \'demo.Permission\' # not an IPermission utility\n+ fti.add_permission = "demo.Permission" # not an IPermission utility\n container_dummy = self.create_dummy()\n self.assertEqual(False, fti.isConstructionAllowed(container_dummy))\n \n@@ -317,85 +318,76 @@ def test_no_permission_means_no_construction(self):\n \n def test_add_view_url_set_on_creation(self):\n fti = DexterityFTI(u"testtype")\n- self.assertEqual(\n- \'string:${folder_url}/++add++testtype\',\n- fti.add_view_expr\n- )\n+ self.assertEqual("string:${folder_url}/++add++testtype", fti.add_view_expr)\n \n def test_factory_set_on_creation(self):\n fti = DexterityFTI(u"testtype")\n- self.assertEqual(\'testtype\', fti.factory)\n+ self.assertEqual("testtype", fti.factory)\n \n def test_addview_and_factory_not_overridden_on_creation(self):\n fti = DexterityFTI(\n u"testtype",\n add_view_expr="string:${folder_url}/@@my-addview",\n- factory="my.factory"\n+ factory="my.factory",\n )\n- self.assertEqual(\n- \'string:${folder_url}/@@my-addview\',\n- fti.add_view_expr\n- )\n- self.assertEqual(\'my.factory\', fti.factory)\n+ self.assertEqual("string:${folder_url}/@@my-addview", fti.add_view_expr)\n+ self.assertEqual("my.factory", fti.factory)\n \n def test_meta_type(self):\n fti = DexterityFTI(\n- u"testtype",\n- klass="plone.dexterity.tests.test_fti.TestClass"\n+ u"testtype", klass="plone.dexterity.tests.test_fti.TestClass"\n )\n self.assertEqual(TestClass.meta_type, fti.Metatype())\n \n def test_meta_type_change_class(self):\n fti = DexterityFTI(\n- u"testtype",\n- klass="plone.dexterity.tests.test_fti.TestClass"\n- )\n- fti._updateProperty(\n- \'klass\',\n- "plone.dexterity.tests.test_fti.TestClass2"\n+ u"testtype", klass="plone.dexterity.tests.test_fti.TestClass"\n )\n+ fti._updateProperty("klass", "plone.dexterity.tests.test_fti.TestClass2")\n self.assertEqual(TestClass2.meta_type, fti.Metatype())\n \n def test_title_i18n(self):\n- fti = DexterityFTI(u\'testtype\', title=b\'t\\xc3\\xa9st\')\n+ fti = DexterityFTI(u"testtype", title=b"t\\xc3\\xa9st")\n \n # with no i18n domain, we get the UTF8-encoded title\n- self.assertEqual(b\'t\\xc3\\xa9st\'.decode(\'utf8\'), fti.Title())\n+ self.assertEqual(b"t\\xc3\\xa9st".decode("utf8"), fti.Title())\n \n # with an i18n domain, we get a Message\n- fti.i18n_domain = \'test\'\n+ fti.i18n_domain = "test"\n msgid = fti.Title()\n- self.assertEqual(u\'t\\xe9st\', msgid)\n- self.assertEqual(\'test\', msgid.domain)\n+ self.assertEqual(u"t\\xe9st", msgid)\n+ self.assertEqual("test", msgid.domain)\n \n def test_description_i18n(self):\n- fti = DexterityFTI(u\'testtype\', description=b\'t\\xc3\\xa9st\')\n+ fti = DexterityFTI(u"testtype", description=b"t\\xc3\\xa9st")\n \n # with no i18n domain, we get the UTF8-encoded title\n- self.assertEqual(b\'t\\xc3\\xa9st\'.decode(\'utf8\'), fti.Description())\n+ self.assertEqual(b"t\\xc3\\xa9st".decode("utf8"), fti.Description())\n \n # with an i18n domain, we get a Message\n- fti.i18n_domain = \'test\'\n+ fti.i18n_domain = "test"\n msgid = fti.Description()\n- self.assertEqual(u\'t\\xe9st\', msgid)\n- self.assertEqual(\'test\', msgid.domain)\n+ self.assertEqual(u"t\\xe9st", msgid)\n+ self.assertEqual("test", msgid.domain)\n \n def test_lookupModel_without_schema_policy(self):\n gsm = getGlobalSiteManager()\n gsm.registerUtility(\n DexteritySchemaPolicy(),\n plone.supermodel.interfaces.ISchemaPolicy,\n- name=u"dexterity"\n+ name=u"dexterity",\n )\n \n fti = DexterityFTI(u"testtype")\n fti.schema = None\n- fti.model_source = \'\'\n+ fti.model_source = (\n+ \'\'\n+ )\n fti.model_file = None\n \n model = fti.lookupModel()\n- self.assertEqual(False, ITestInterface in model.schemata[\'\'].__bases__)\n+ self.assertEqual(False, ITestInterface in model.schemata[""].__bases__)\n \n def test_lookupModel_with_schema_policy(self):\n class TestSchemaPolicy(DexteritySchemaPolicy):\n@@ -405,20 +397,20 @@ def bases(self, schemaName, tree):\n gsm = getGlobalSiteManager()\n policy = TestSchemaPolicy()\n gsm.registerUtility(\n- policy,\n- plone.supermodel.interfaces.ISchemaPolicy,\n- name=u"test"\n+ policy, plone.supermodel.interfaces.ISchemaPolicy, name=u"test"\n )\n \n fti = DexterityFTI(u"testtype")\n fti.schema = None\n- fti.model_source = \'\'\n+ fti.model_source = (\n+ \'\'\n+ )\n fti.model_file = None\n fti.schema_policy = u"test"\n \n model = fti.lookupModel()\n- self.assertEqual(True, ITestInterface in model.schemata[\'\'].__bases__)\n+ self.assertEqual(True, ITestInterface in model.schemata[""].__bases__)\n \n \n class TestFTIEvents(MockTestCase):\n@@ -438,32 +430,29 @@ def test_components_registered_on_add(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId()))\n \n args1, kwargs1 = site_manager_mock.registerUtility.call_args_list[0]\n self.assertEqual(args1, (fti, IDexterityFTI, portal_type))\n- self.assertEqual(kwargs1, {\'info\': \'plone.dexterity.dynamic\'})\n+ self.assertEqual(kwargs1, {"info": "plone.dexterity.dynamic"})\n \n args2, kwargs2 = site_manager_mock.registerUtility.call_args_list[1]\n self.assertIsInstance(args2[0], DexterityFactory)\n self.assertEqual(args2[0].portal_type, portal_type)\n self.assertEqual(args2[1:], (IFactory, portal_type))\n- self.assertEqual(kwargs2, {\'info\': \'plone.dexterity.dynamic\'})\n+ self.assertEqual(kwargs2, {"info": "plone.dexterity.dynamic"})\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n- self.assertNotEqual(\n- None,\n- queryUtility(IDexterityFTI, name=portal_type)\n- )\n+ self.assertNotEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertNotEqual(None, queryUtility(IFactory, name=portal_type))\n \n def test_components_not_registered_on_add_if_exist(self):\n@@ -476,18 +465,16 @@ def test_components_not_registered_on_add_if_exist(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Register FTI utility and factory utility\n \n self.mock_utility(fti, IDexterityFTI, name=portal_type)\n- self.mock_utility(\n- DexterityFactory(portal_type),\n- IFactory,\n- name=portal_type\n- )\n+ self.mock_utility(DexterityFactory(portal_type), IFactory, name=portal_type)\n \n # We expect that all components are registered, so do not expect any\n # registrations\n@@ -506,8 +493,10 @@ def test_components_unregistered_on_delete(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # First add the components\n@@ -516,16 +505,16 @@ def test_components_unregistered_on_delete(self):\n # Then remove them again\n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n self.assertEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertEqual(None, queryUtility(IFactory, name=portal_type))\n \n- def test_components_unregistered_on_delete_does_not_error_with_no_components(self): # noqa\n+ def test_components_unregistered_on_delete_does_not_error_with_no_components(\n+ self,\n+ ): # noqa\n portal_type = u"testtype"\n fti = DexterityFTI(portal_type)\n container_dummy = self.create_dummy()\n@@ -535,8 +524,10 @@ def test_components_unregistered_on_delete_does_not_error_with_no_components(sel\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # We expect to always be able to unregister without error, even if the\n@@ -545,7 +536,8 @@ def test_components_unregistered_on_delete_does_not_error_with_no_components(sel\n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n site_manager_mock.unregisterUtility.assert_called_once_with(\n- provided=IDexterityFTI, name=portal_type)\n+ provided=IDexterityFTI, name=portal_type\n+ )\n \n def test_global_components_not_unregistered_on_delete(self):\n portal_type = u"testtype"\n@@ -557,18 +549,16 @@ def test_global_components_not_unregistered_on_delete(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Register FTI utility and factory utility\n \n self.mock_utility(fti, IDexterityFTI, name=portal_type)\n- self.mock_utility(\n- DexterityFactory(portal_type),\n- IFactory,\n- name=portal_type\n- )\n+ self.mock_utility(DexterityFactory(portal_type), IFactory, name=portal_type)\n \n # We expect to always be able to unregister without error, even if the\n # component exists. The factory is only unregistered if it was\n@@ -576,16 +566,11 @@ def test_global_components_not_unregistered_on_delete(self):\n \n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n- self.assertNotEqual(\n- None,\n- queryUtility(IDexterityFTI, name=portal_type)\n- )\n+ self.assertNotEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertNotEqual(None, queryUtility(IFactory, name=portal_type))\n \n def test_components_reregistered_on_rename(self):\n@@ -598,24 +583,19 @@ def test_components_reregistered_on_rename(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n- self.assertEqual(\n- \'string:${folder_url}/++add++testtype\',\n- fti.add_view_expr\n- )\n+ self.assertEqual("string:${folder_url}/++add++testtype", fti.add_view_expr)\n \n ftiRenamed(\n fti,\n ObjectMovedEvent(\n- fti,\n- container_dummy,\n- fti.getId(),\n- container_dummy,\n- u"newtype"\n- )\n+ fti, container_dummy, fti.getId(), container_dummy, u"newtype"\n+ ),\n )\n \n # First look for unregistration of all local components\n@@ -626,16 +606,11 @@ def test_components_reregistered_on_rename(self):\n # Then look for re-registration of global components\n self.assertEqual(site_manager_mock.registerUtility.call_count, 2)\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n- self.assertNotEqual(\n- None,\n- queryUtility(IDexterityFTI, name=portal_type)\n- )\n+ self.assertNotEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertNotEqual(None, queryUtility(IFactory, name=portal_type))\n \n def test_dynamic_schema_refreshed_on_modify_model_file(self):\n@@ -650,9 +625,7 @@ class INew(Interface):\n fti.lookupModel = Mock(return_value=model_dummy)\n self.create_dummy()\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n class IBlank1(Interface):\n@@ -666,13 +639,12 @@ class IBlank1(Interface):\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'model_file\', \'\')\n- )\n+ fti, DexterityFTIModificationDescription("model_file", "")\n+ ),\n )\n \n- self.assertTrue(\'title\' in IBlank1)\n- self.assertTrue(IBlank1[\'title\'].title == u"title")\n+ self.assertTrue("title" in IBlank1)\n+ self.assertTrue(IBlank1["title"].title == u"title")\n \n def test_dynamic_schema_refreshed_on_modify_model_source(self):\n portal_type = u"testtype"\n@@ -686,9 +658,7 @@ class INew(Interface):\n fti.lookupModel = Mock(return_value=model_dummy)\n self.create_dummy()\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n # b/c of zope.interface does not support hashing of the same class multiple times\n@@ -705,13 +675,12 @@ class IBlank2(Interface):\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'model_source\', \'\')\n- )\n+ fti, DexterityFTIModificationDescription("model_source", "")\n+ ),\n )\n \n- self.assertTrue(\'title\' in IBlank2)\n- self.assertTrue(IBlank2[\'title\'].title == u"title")\n+ self.assertTrue("title" in IBlank2)\n+ self.assertTrue(IBlank2["title"].title == u"title")\n \n def test_dynamic_schema_refreshed_on_modify_schema_policy(self):\n portal_type = u"testtype"\n@@ -730,14 +699,10 @@ def bases(self, schemaName, tree):\n gsm = getGlobalSiteManager()\n policy = TestSchemaPolicy()\n gsm.registerUtility(\n- policy,\n- plone.supermodel.interfaces.ISchemaPolicy,\n- name=u"test"\n+ policy, plone.supermodel.interfaces.ISchemaPolicy, name=u"test"\n )\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n # Set source interface\n@@ -745,7 +710,7 @@ def bases(self, schemaName, tree):\n setattr(plone.dexterity.schema.generated, schemaName, IBlank3)\n original = getattr(plone.dexterity.schema.generated, schemaName)\n self.assertNotIn(INew, original.__bases__)\n- self.assertNotIn(\'title\', original)\n+ self.assertNotIn("title", original)\n \n # Set new schema_policy\n fti.schema_policy = "test"\n@@ -754,12 +719,11 @@ def bases(self, schemaName, tree):\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'schema_policy\', \'\')\n- )\n+ fti, DexterityFTIModificationDescription("schema_policy", "")\n+ ),\n )\n updated = getattr(plone.dexterity.schema.generated, schemaName)\n- self.assertIn(\'title\', updated)\n+ self.assertIn("title", updated)\n self.assertIn(INew, updated.__bases__)\n \n def test_concrete_schema_not_refreshed_on_modify_schema(self):\n@@ -775,9 +739,7 @@ class INew(Interface):\n model_dummy = Model({u"": INew})\n fti.lookupModel = Mock(return_value=model_dummy)\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n # Set schema to something so that hasDynamicSchema is false\n@@ -792,13 +754,10 @@ class INew(Interface):\n \n ftiModified(\n fti,\n- ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'schema\', \'\')\n- )\n+ ObjectModifiedEvent(fti, DexterityFTIModificationDescription("schema", "")),\n )\n \n- self.assertFalse(\'title\' in IBlank4)\n+ self.assertFalse("title" in IBlank4)\n \n def test_old_factory_unregistered_after_name_changed_if_dynamic(self):\n portal_type = u"testtype"\n@@ -809,34 +768,37 @@ def test_old_factory_unregistered_after_name_changed_if_dynamic(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend like we have a utility registered\n \n reg1 = self.create_dummy()\n reg1.provided = IFactory\n- reg1.name = \'old-factory\'\n- reg1.info = \'plone.dexterity.dynamic\'\n+ reg1.name = "old-factory"\n+ reg1.info = "plone.dexterity.dynamic"\n \n site_manager_mock.registeredUtilities = Mock(return_value=[reg1])\n \n- fti.factory = \'new-factory\'\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'factory\', \'old-factory\')\n- )\n+ fti, DexterityFTIModificationDescription("factory", "old-factory")\n+ ),\n )\n \n # Expect this to get removed\n site_manager_mock.unregisterUtility.assert_called_once_with(\n- provided=IFactory, name=\'old-factory\')\n+ provided=IFactory, name="old-factory"\n+ )\n # And a new one to be created with the new factory name\n self.assertEqual(\n- site_manager_mock.registerUtility.call_args[0][2], \'new-factory\')\n+ site_manager_mock.registerUtility.call_args[0][2], "new-factory"\n+ )\n \n def test_new_factory_not_registered_after_name_changed_if_exists(self):\n portal_type = u"testtype"\n@@ -847,24 +809,21 @@ def test_new_factory_not_registered_after_name_changed_if_exists(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Create a global default for the new name\n- self.mock_utility(\n- DexterityFactory(portal_type),\n- IFactory,\n- name=\'new-factory\'\n- )\n+ self.mock_utility(DexterityFactory(portal_type), IFactory, name="new-factory")\n \n- fti.factory = \'new-factory\'\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'factory\', \'old-factory\')\n- )\n+ fti, DexterityFTIModificationDescription("factory", "old-factory")\n+ ),\n )\n \n # Factory should not be registered again\n@@ -879,80 +838,82 @@ def test_old_factory_not_unregistered_if_not_created_by_dexterity(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend like we have a utility registered\n \n reg1 = self.create_dummy()\n reg1.provided = IFactory\n- reg1.name = \'old-factory\'\n+ reg1.name = "old-factory"\n reg1.info = None\n \n site_manager_mock.registeredUtilities = Mock(return_value=[reg1])\n \n- fti.factory = \'new-factory\'\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'factory\', \'old-factory\')\n- )\n+ fti, DexterityFTIModificationDescription("factory", "old-factory")\n+ ),\n )\n \n # This should not be removed, since we didn\'t create it\n self.assertFalse(site_manager_mock.unregisterUtility.called)\n # A new one may still be created, however\n self.assertEqual(\n- site_manager_mock.registerUtility.call_args[0][2], \'new-factory\')\n+ site_manager_mock.registerUtility.call_args[0][2], "new-factory"\n+ )\n \n def test_renamed_factory_not_unregistered_if_not_unique(self):\n portal_type = u"testtype"\n- fti = DexterityFTI(portal_type, factory=\'common-factory\')\n+ fti = DexterityFTI(portal_type, factory="common-factory")\n portal_type2 = u"testtype2"\n- fti2 = DexterityFTI(portal_type2, factory=\'common-factory\')\n+ fti2 = DexterityFTI(portal_type2, factory="common-factory")\n \n # Mock the lookup of the site and the site manager at the site root\n dummy_site = self.create_dummy()\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend two FTIs are registered, both using common-factory\n- site_manager_mock.registeredUtilities = Mock(return_value=[\n- self.create_dummy(\n- provided=IFactory,\n- name=\'common-factory\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- self.create_dummy(\n- component=fti,\n- provided=IDexterityFTI,\n- name=\'testtype\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- self.create_dummy(\n- component=fti2,\n- provided=IDexterityFTI,\n- name=\'testtype2\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- ])\n-\n- fti.factory = \'new-factory\'\n+ site_manager_mock.registeredUtilities = Mock(\n+ return_value=[\n+ self.create_dummy(\n+ provided=IFactory,\n+ name="common-factory",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ self.create_dummy(\n+ component=fti,\n+ provided=IDexterityFTI,\n+ name="testtype",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ self.create_dummy(\n+ component=fti2,\n+ provided=IDexterityFTI,\n+ name="testtype2",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ ]\n+ )\n+\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\n- \'factory\',\n- \'common-factory\'\n- )\n- )\n+ fti, DexterityFTIModificationDescription("factory", "common-factory")\n+ ),\n )\n \n # We shouldn\'t remove this since fti2 still uses it\n@@ -960,13 +921,14 @@ def test_renamed_factory_not_unregistered_if_not_unique(self):\n \n # A new one may still be created, however\n self.assertEqual(\n- site_manager_mock.registerUtility.call_args[0][2], \'new-factory\')\n+ site_manager_mock.registerUtility.call_args[0][2], "new-factory"\n+ )\n \n def test_deleted_factory_not_unregistered_if_not_unique(self):\n portal_type = u"testtype"\n- fti = DexterityFTI(portal_type, factory=\'common-factory\')\n+ fti = DexterityFTI(portal_type, factory="common-factory")\n portal_type2 = u"testtype2"\n- fti2 = DexterityFTI(portal_type2, factory=\'common-factory\')\n+ fti2 = DexterityFTI(portal_type2, factory="common-factory")\n container_dummy = self.create_dummy()\n \n # Mock the lookup of the site and the site manager at the site root\n@@ -974,31 +936,35 @@ def test_deleted_factory_not_unregistered_if_not_unique(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend two FTIs are registered, both using common-factory\n # NB: Assuming that "testtype" was already removed when this gets\n # called\n- site_manager_mock.registeredUtilities = Mock(return_value=[\n- self.create_dummy(\n- provided=IFactory,\n- name=\'common-factory\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- self.create_dummy(\n- component=fti2,\n- provided=IDexterityFTI,\n- name=\'testtype2\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- ])\n+ site_manager_mock.registeredUtilities = Mock(\n+ return_value=[\n+ self.create_dummy(\n+ provided=IFactory,\n+ name="common-factory",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ self.create_dummy(\n+ component=fti2,\n+ provided=IDexterityFTI,\n+ name="testtype2",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ ]\n+ )\n \n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n # We shouldn\'t remove this since fti2 still uses it\n # The type itself should be removed though\n site_manager_mock.unregisterUtility.assert_called_once_with(\n- provided=IDexterityFTI, name=u\'testtype\'\n+ provided=IDexterityFTI, name=u"testtype"\n )\ndiff --git a/plone/dexterity/tests/test_primary.py b/plone/dexterity/tests/test_primary.py\nindex e24741b..403e038 100644\n--- a/plone/dexterity/tests/test_primary.py\n+++ b/plone/dexterity/tests/test_primary.py\n@@ -15,24 +15,25 @@\n except ImportError:\n from mock import Mock\n \n+\n class PrimaryFieldInfoTestCase(MockTestCase):\n def test_primary_field_info(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n+\n+ alsoProvides(ITest["body"], IPrimaryField)\n \n fti = DexterityFTI(u"testtype")\n fti.lookupSchema = Mock(return_value=ITest)\n fti.behaviors = []\n self.mock_utility(fti, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n- item.body = u\'body text\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n+ item.body = u"body text"\n \n info = PrimaryFieldInfo(item)\n- assert info.fieldname == \'body\'\n- assert info.field == ITest[\'body\']\n- assert info.value == \'body text\'\n+ assert info.fieldname == "body"\n+ assert info.field == ITest["body"]\n+ assert info.value == "body text"\ndiff --git a/plone/dexterity/tests/test_schema.py b/plone/dexterity/tests/test_schema.py\nindex 87b3ec6..35e90e9 100644\n--- a/plone/dexterity/tests/test_schema.py\n+++ b/plone/dexterity/tests/test_schema.py\n@@ -20,20 +20,20 @@\n except ImportError:\n from mock import Mock\n \n-class TestSchemaModuleFactory(MockTestCase):\n \n+class TestSchemaModuleFactory(MockTestCase):\n def test_transient_schema(self):\n \n # No IDexterityFTI registered\n factory = schema.SchemaModuleFactory()\n- schemaName = schema.portalTypeToSchemaName(\'testtype\', prefix=\'site\')\n+ schemaName = schema.portalTypeToSchemaName("testtype", prefix="site")\n klass = factory(schemaName, schema.generated)\n \n self.assertTrue(isinstance(klass, InterfaceClass))\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n self.assertEqual((), tuple(zope.schema.getFields(klass)))\n \n def test_concrete_default_schema(self):\n@@ -41,24 +41,25 @@ def test_concrete_default_schema(self):\n # Mock schema model\n class IDummy(Interface):\n dummy = zope.schema.TextLine(title=u"Dummy")\n+\n mock_model = Model({u"": IDummy})\n \n # Mock FTI\n fti_mock = Mock(spec=DexterityFTI)\n fti_mock.lookupModel = Mock(return_value=mock_model)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n factory = schema.SchemaModuleFactory()\n \n- schemaName = schema.portalTypeToSchemaName(\'testtype\', prefix=\'site\')\n+ schemaName = schema.portalTypeToSchemaName("testtype", prefix="site")\n klass = factory(schemaName, schema.generated)\n \n self.assertTrue(isinstance(klass, InterfaceClass))\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n- self.assertEqual((\'dummy\',), tuple(zope.schema.getFieldNames(klass)))\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n+ self.assertEqual(("dummy",), tuple(zope.schema.getFieldNames(klass)))\n \n def test_named_schema(self):\n \n@@ -68,20 +69,18 @@ class IDummy(Interface):\n \n class INamedDummy(Interface):\n named = zope.schema.TextLine(title=u"Named")\n- mock_model = Model({u"": IDummy,\n- u"named": INamedDummy})\n+\n+ mock_model = Model({u"": IDummy, u"named": INamedDummy})\n \n # Mock FTI\n fti_mock = Mock(spec=DexterityFTI)\n fti_mock.lookupModel = Mock(return_value=mock_model)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n factory = schema.SchemaModuleFactory()\n \n schemaName = schema.portalTypeToSchemaName(\n- \'testtype\',\n- schema=u"named",\n- prefix=\'site\'\n+ "testtype", schema=u"named", prefix="site"\n )\n klass = factory(schemaName, schema.generated)\n \n@@ -92,13 +91,13 @@ class INamedDummy(Interface):\n \n self.assertFalse(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n- self.assertEqual((\'named\',), tuple(zope.schema.getFieldNames(klass)))\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n+ self.assertEqual(("named",), tuple(zope.schema.getFieldNames(klass)))\n \n def test_transient_schema_made_concrete(self):\n \n factory = schema.SchemaModuleFactory()\n- schemaName = schema.portalTypeToSchemaName(\'testtype\', prefix=\'site\')\n+ schemaName = schema.portalTypeToSchemaName("testtype", prefix="site")\n \n # No IDexterityFTI registered\n \n@@ -107,7 +106,7 @@ def test_transient_schema_made_concrete(self):\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n self.assertEqual((), tuple(zope.schema.getFields(klass)))\n \n # Calling it again gives the same result\n@@ -117,18 +116,19 @@ def test_transient_schema_made_concrete(self):\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n self.assertEqual((), tuple(zope.schema.getFields(klass)))\n \n # Now register a mock FTI and try again\n \n class IDummy(Interface):\n dummy = zope.schema.TextLine(title=u"Dummy")\n+\n mock_model = Model({u"": IDummy})\n \n fti_mock = Mock(spec=DexterityFTI)\n fti_mock.lookupModel = Mock(return_value=mock_model)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n klass = factory(schemaName, schema.generated)\n \n@@ -136,61 +136,64 @@ class IDummy(Interface):\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n \n # Now we get the fields from the FTI\'s model\n- self.assertEqual((\'dummy\',), tuple(zope.schema.getFieldNames(klass)))\n+ self.assertEqual(("dummy",), tuple(zope.schema.getFieldNames(klass)))\n \n def test_portalTypeToSchemaName_with_schema_and_prefix(self):\n self.assertEqual(\n- \'prefix_0_type_0_schema\',\n- schema.portalTypeToSchemaName(\'type\', \'schema\', \'prefix\')\n+ "prefix_0_type_0_schema",\n+ schema.portalTypeToSchemaName("type", "schema", "prefix"),\n )\n self.assertEqual(\n- \'prefix_0_type\',\n- schema.portalTypeToSchemaName(\'type\', \'\', \'prefix\')\n+ "prefix_0_type", schema.portalTypeToSchemaName("type", "", "prefix")\n )\n self.assertEqual(\n- \'prefix_0_type_1_one_2_two\',\n- schema.portalTypeToSchemaName(\'type one.two\', \'\', \'prefix\')\n+ "prefix_0_type_1_one_2_two",\n+ schema.portalTypeToSchemaName("type one.two", "", "prefix"),\n )\n \n def test_portalTypeToSchemaName_looks_up_portal_for_prefix(self):\n portal_mock = Mock()\n- portal_mock.getPhysicalPath = Mock(return_value=[\'\', \'foo\', \'portalid\'])\n+ portal_mock.getPhysicalPath = Mock(return_value=["", "foo", "portalid"])\n self.mock_utility(portal_mock, ISiteRoot)\n \n- self.assertEqual(\n- \'foo_4_portalid_0_type\',\n- schema.portalTypeToSchemaName(\'type\')\n- )\n+ self.assertEqual("foo_4_portalid_0_type", schema.portalTypeToSchemaName("type"))\n \n def test_schemaNameToPortalType(self):\n self.assertEqual(\n- \'type\',\n- schema.schemaNameToPortalType(\'prefix_0_type_0_schema\')\n- )\n- self.assertEqual(\n- \'type\',\n- schema.schemaNameToPortalType(\'prefix_0_type\')\n+ "type", schema.schemaNameToPortalType("prefix_0_type_0_schema")\n )\n+ self.assertEqual("type", schema.schemaNameToPortalType("prefix_0_type"))\n self.assertEqual(\n- \'type one.two\',\n- schema.schemaNameToPortalType(\'prefix_0_type_1_one_2_two\')\n+ "type one.two", schema.schemaNameToPortalType("prefix_0_type_1_one_2_two")\n )\n \n def test_splitSchemaName(self):\n self.assertEqual(\n- (\'prefix\', \'type\', \'schema\',),\n- schema.splitSchemaName(\'prefix_0_type_0_schema\')\n+ (\n+ "prefix",\n+ "type",\n+ "schema",\n+ ),\n+ schema.splitSchemaName("prefix_0_type_0_schema"),\n )\n self.assertEqual(\n- (\'prefix\', \'type\', \'\',),\n- schema.splitSchemaName(\'prefix_0_type\')\n+ (\n+ "prefix",\n+ "type",\n+ "",\n+ ),\n+ schema.splitSchemaName("prefix_0_type"),\n )\n self.assertEqual(\n- (\'prefix\', \'type one.two\', \'\',),\n- schema.splitSchemaName(\'prefix_0_type_1_one_2_two\')\n+ (\n+ "prefix",\n+ "type one.two",\n+ "",\n+ ),\n+ schema.splitSchemaName("prefix_0_type_1_one_2_two"),\n )\n \n def test_invalidate_cache(self):\n@@ -198,9 +201,7 @@ def test_invalidate_cache(self):\n fti = DexterityFTI(portal_type)\n SCHEMA_CACHE.get(portal_type)\n SCHEMA_CACHE.behavior_schema_interfaces(fti)\n- self.assertIn(\'_v_schema_behavior_schema_interfaces\',\n- fti.__dict__.keys())\n+ self.assertIn("_v_schema_behavior_schema_interfaces", fti.__dict__.keys())\n \n invalidate_cache(fti)\n- self.assertNotIn(\'_v_schema_behavior_schema_interfaces\',\n- fti.__dict__.keys())\n+ self.assertNotIn("_v_schema_behavior_schema_interfaces", fti.__dict__.keys())\ndiff --git a/plone/dexterity/tests/test_schema_cache.py b/plone/dexterity/tests/test_schema_cache.py\nindex df4aa1a..8940b7f 100644\n--- a/plone/dexterity/tests/test_schema_cache.py\n+++ b/plone/dexterity/tests/test_schema_cache.py\n@@ -18,12 +18,10 @@\n \n \n class TestSchemaCache(MockTestCase):\n-\n def setUp(self):\n SCHEMA_CACHE.clear()\n \n def test_repeated_get_lookup(self):\n-\n class ISchema(Interface):\n pass\n \n@@ -44,24 +42,23 @@ def test_repeated_behavior_registration_lookup(self):\n # Mock a test behavior\n class ITestBehavior(Interface):\n pass\n+\n fti.behaviors = [ITestBehavior.__identifier__]\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=Interface,\n marker=ITestBehavior,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestBehavior.__identifier__\n- )\n \n- r1 = SCHEMA_CACHE.behavior_registrations(u\'testtype\')\n- r2 = SCHEMA_CACHE.behavior_registrations(u\'testtype\')\n+ self.mock_utility(registration, IBehavior, ITestBehavior.__identifier__)\n+\n+ r1 = SCHEMA_CACHE.behavior_registrations(u"testtype")\n+ r2 = SCHEMA_CACHE.behavior_registrations(u"testtype")\n \n self.assertTrue(r1[0] is r2[0] is registration)\n \n@@ -72,11 +69,11 @@ def test_unexistent_behaviors_lookup(self):\n fti.behaviors = ["foo.bar"]\n \n with patch("warnings.warn") as mock_warnings:\n- SCHEMA_CACHE.behavior_registrations(u\'testtype\')\n+ SCHEMA_CACHE.behavior_registrations(u"testtype")\n # Verify the warning has been issued\n mock_warnings.assert_called_once_with(\n (\n- \'No behavior registration found for behavior named \'\n+ "No behavior registration found for behavior named "\n \'"foo.bar" for factory "testtype" - trying deprecated \'\n \'fallback lookup (will be removed in 3.0)..."\'\n ),\n@@ -94,21 +91,20 @@ class ITestSchema(Interface):\n \n class ITestMarker(Interface):\n pass\n+\n fti.behaviors = [ITestSchema.__identifier__]\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=ITestSchema,\n marker=ITestMarker,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestSchema.__identifier__\n- )\n+\n+ self.mock_utility(registration, IBehavior, ITestSchema.__identifier__)\n \n s1 = SCHEMA_CACHE.subtypes(u"testtype")\n s2 = SCHEMA_CACHE.subtypes(u"testtype")\n@@ -116,7 +112,6 @@ class ITestMarker(Interface):\n self.assertTrue(s1[0] is s2[0] is ITestMarker)\n \n def test_repeated_lookup_with_changed_schema(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -133,7 +128,6 @@ class ISchema2(Interface):\n self.assertTrue(schema1 is schema2 and schema2 is ISchema1)\n \n def test_repeated_lookup_with_changed_schema_and_invalidation(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -152,7 +146,6 @@ class ISchema2(Interface):\n self.assertTrue(schema2 is ISchema2)\n \n def test_none_not_cached(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -160,34 +153,32 @@ class ISchema1(Interface):\n fti.lookupSchema = Mock(side_effect=[None, ISchema1, ISchema1])\n self.mock_utility(fti, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema1 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema2 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema3 = SCHEMA_CACHE.get(u"testtype")\n \n self.assertTrue(schema1 is None)\n self.assertTrue(schema2 is schema3 is ISchema1)\n \n def test_attribute_and_value_error_not_cached(self):\n-\n class ISchema1(Interface):\n pass\n \n fti = DexterityFTI(u"testtype")\n- fti.lookupSchema = Mock(\n- side_effect=[AttributeError, ValueError, ISchema1])\n+ fti.lookupSchema = Mock(side_effect=[AttributeError, ValueError, ISchema1])\n self.mock_utility(fti, IDexterityFTI, name=u"testtype")\n \n schema1 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema2 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema3 = SCHEMA_CACHE.get(u"testtype")\n \n self.assertTrue(schema1 is None)\n@@ -195,7 +186,6 @@ class ISchema1(Interface):\n self.assertTrue(schema3 is ISchema1)\n \n def test_unknown_type_not_cached(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -211,7 +201,6 @@ class ISchema1(Interface):\n self.assertTrue(schema2 is schema3 is ISchema1)\n \n def test_clear_all_caches(self):\n-\n class ISchema1(Interface):\n pass\n \ndiff --git a/plone/dexterity/tests/test_security.py b/plone/dexterity/tests/test_security.py\nindex aeebc0b..af4ccd6 100644\n--- a/plone/dexterity/tests/test_security.py\n+++ b/plone/dexterity/tests/test_security.py\n@@ -18,8 +18,9 @@\n from unittest.mock import Mock\n except ImportError:\n from mock import Mock\n-class TestAttributeProtection(MockTestCase):\n \n+\n+class TestAttributeProtection(MockTestCase):\n def setUp(self):\n SCHEMA_CACHE.clear()\n \n@@ -30,8 +31,7 @@ class ITestSchema(Interface):\n test = zope.schema.TextLine(title=u"Test")\n \n ITestSchema.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test=\'zope2.View\', foo=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test="zope2.View", foo="foo.View")\n )\n \n from plone.autoform.interfaces import IFormFieldProvider\n@@ -41,54 +41,46 @@ class ITestBehavior(Interface):\n test2 = zope.schema.TextLine(title=u"Test")\n \n ITestBehavior.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test2=\'zope2.View\', foo2=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test2="zope2.View", foo2="foo.View")\n )\n \n # Mock a test behavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=ITestBehavior,\n marker=Interface,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestBehavior.__identifier__\n- )\n+\n+ self.mock_utility(registration, IBehavior, ITestBehavior.__identifier__)\n+ from plone.behavior.interfaces import IBehaviorAssignable\n from plone.dexterity.behavior import DexterityBehaviorAssignable\n from plone.dexterity.interfaces import IDexterityContent\n- from plone.behavior.interfaces import IBehaviorAssignable\n+\n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.behaviors = ()\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Mock permissions\n self.mock_utility(\n- Permission(u\'zope2.View\', u"View"),\n- IPermission,\n- u\'zope2.View\'\n+ Permission(u"zope2.View", u"View"), IPermission, u"zope2.View"\n )\n self.mock_utility(\n- Permission(u\'foo.View\', u"View foo"),\n- IPermission,\n- u\'foo.View\'\n+ Permission(u"foo.View", u"View foo"), IPermission, u"foo.View"\n )\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n@@ -96,30 +88,27 @@ class ITestBehavior(Interface):\n # mock security manager\n security_manager_mock = Mock()\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n # run 1: schema and no behavior access to schema protected attribute\n security_manager_mock.checkPermission = Mock(return_value=False)\n SCHEMA_CACHE.clear()\n self.assertFalse(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n+ item.__allow_access_to_unprotected_subobjects__("test", u"foo")\n )\n- security_manager_mock.checkPermission.assert_called_with(\'View\', item)\n+ security_manager_mock.checkPermission.assert_called_with("View", item)\n \n # run 2: schema and no behavior access to known non schema attribute\n security_manager_mock.checkPermission = Mock(return_value=True)\n SCHEMA_CACHE.clear()\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View foo\', item)\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n+ security_manager_mock.checkPermission.assert_called_with("View foo", item)\n \n # run 3: schema and no behavior, unknown attributes are allowed\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n # run 4: schema and behavior\n@@ -127,18 +116,18 @@ class ITestBehavior(Interface):\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test2\', u"foo2")\n+ item.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\'View\', item)\n+ security_manager_mock.checkPermission.assert_called_with("View", item)\n \n # run 5: no schema but behavior\n security_manager_mock.checkPermission = Mock(return_value=True)\n fti_mock.lookupSchema = Mock(return_value=None)\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test2\', u"foo2")\n+ item.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\'View\', item)\n+ security_manager_mock.checkPermission.assert_called_with("View", item)\n \n def test_container(self):\n \n@@ -147,8 +136,7 @@ class ITestSchema(Interface):\n test = zope.schema.TextLine(title=u"Test")\n \n ITestSchema.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test=\'zope2.View\', foo=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test="zope2.View", foo="foo.View")\n )\n \n from plone.autoform.interfaces import IFormFieldProvider\n@@ -158,54 +146,46 @@ class ITestBehavior(Interface):\n test2 = zope.schema.TextLine(title=u"Test")\n \n ITestBehavior.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test2=\'zope2.View\', foo2=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test2="zope2.View", foo2="foo.View")\n )\n \n # Mock a test behavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=ITestBehavior,\n marker=Interface,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestBehavior.__identifier__\n- )\n+\n+ self.mock_utility(registration, IBehavior, ITestBehavior.__identifier__)\n+ from plone.behavior.interfaces import IBehaviorAssignable\n from plone.dexterity.behavior import DexterityBehaviorAssignable\n from plone.dexterity.interfaces import IDexterityContent\n- from plone.behavior.interfaces import IBehaviorAssignable\n+\n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n fti_mock.behaviors = ()\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Mock permissions\n self.mock_utility(\n- Permission(u\'zope2.View\', u"View"),\n- IPermission,\n- u\'zope2.View\'\n+ Permission(u"zope2.View", u"View"), IPermission, u"zope2.View"\n )\n self.mock_utility(\n- Permission(u\'foo.View\', u"View foo"),\n- IPermission,\n- u\'foo.View\'\n+ Permission(u"foo.View", u"View foo"), IPermission, u"foo.View"\n )\n \n # Content item\n- container = Container(\'test\')\n+ container = Container("test")\n container.portal_type = u"testtype"\n container.test = u"foo"\n container.foo = u"bar"\n@@ -213,40 +193,29 @@ class ITestBehavior(Interface):\n # mock security manager\n security_manager_mock = Mock()\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n # run 1: schema and no behavior access to schema protected attribute\n security_manager_mock.checkPermission = Mock(return_value=False)\n SCHEMA_CACHE.clear()\n self.assertFalse(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'test\',\n- u"foo"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("test", u"foo")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View", container)\n \n # run 2: schema and no behavior access to known non schema attribute\n security_manager_mock.checkPermission = Mock(return_value=True)\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'foo\',\n- u"bar"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("foo", u"bar")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View foo\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View foo", container)\n \n # run 3: schema and no behavior, unknown attributes are allowed\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'random\',\n- u"stuff"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n # run 4: schema and behavior\n@@ -254,26 +223,18 @@ class ITestBehavior(Interface):\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'test2\',\n- u"foo2"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View", container)\n \n # run 5: no schema but behavior\n fti_mock.lookupSchema = Mock(return_value=None)\n security_manager_mock.checkPermission = Mock(return_value=True)\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'test2\',\n- u"foo2"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View", container)\n \n def test_no_tagged_value(self):\n \n@@ -285,10 +246,10 @@ class ITestSchema(Interface):\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n fti_mock.behaviors = ()\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n@@ -296,16 +257,12 @@ class ITestSchema(Interface):\n SCHEMA_CACHE.clear()\n \n # Everything allowed\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n \n # Unknown attributes are allowed\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_no_read_permission(self):\n@@ -313,22 +270,23 @@ def test_no_read_permission(self):\n # Mock schema model\n class ITestSchema(Interface):\n test = zope.schema.TextLine(title=u"Test")\n- ITestSchema.setTaggedValue(READ_PERMISSIONS_KEY, dict(foo=\'foo.View\'))\n+\n+ ITestSchema.setTaggedValue(READ_PERMISSIONS_KEY, dict(foo="foo.View"))\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n fti_mock.behaviors = ()\n \n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Mock permissions\n self.mock_utility(\n- Permission(u\'foo.View\', u"View foo"), IPermission, u\'foo.View\'\n+ Permission(u"foo.View", u"View foo"), IPermission, u"foo.View"\n )\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n@@ -337,21 +295,17 @@ class ITestSchema(Interface):\n security_manager_mock = Mock()\n security_manager_mock.checkPermission = Mock(return_value=True)\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n SCHEMA_CACHE.clear()\n \n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n \n # Unknown attributes are allowed\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_no_schema(self):\n@@ -360,24 +314,20 @@ def test_no_schema(self):\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=None)\n fti_mock.behaviors = ()\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n \n SCHEMA_CACHE.clear()\n \n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_schema_exception(self):\n@@ -387,38 +337,32 @@ def test_schema_exception(self):\n fti_mock.lookupSchema = Mock(side_effect=AttributeError)\n fti_mock.behaviors = ()\n \n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n \n SCHEMA_CACHE.clear()\n \n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_empty_name(self):\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n \n SCHEMA_CACHE.clear()\n \n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'\', u"foo")\n- )\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("", u"foo"))\ndiff --git a/plone/dexterity/tests/test_utils.py b/plone/dexterity/tests/test_utils.py\nindex c4c7401..37a8296 100644\n--- a/plone/dexterity/tests/test_utils.py\n+++ b/plone/dexterity/tests/test_utils.py\n@@ -11,11 +11,10 @@\n \n \n class TestUtils(MockTestCase):\n-\n def test_getAdditionalSchemata(self):\n- from plone.dexterity.interfaces import IDexterityFTI\n- from plone.behavior.interfaces import IBehavior\n from plone.autoform.interfaces import IFormFieldProvider\n+ from plone.behavior.interfaces import IBehavior\n+ from plone.dexterity.interfaces import IDexterityFTI\n from zope.interface import Interface\n from zope.interface import providedBy\n \n@@ -26,10 +25,10 @@ class IBehaviorSchema(Interface):\n pass\n \n behavior_mock = Mock()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n \n- portal_type = \'prefix_0_type_0_schema\'\n- behavior_name = \'behavior_0\'\n+ portal_type = "prefix_0_type_0_schema"\n+ behavior_name = "behavior_0"\n \n fti_mock.behaviors = (behavior_name,)\n behavior_mock.interface = IBehaviorInterface\n@@ -40,9 +39,7 @@ class IBehaviorSchema(Interface):\n self.mock_utility(fti_mock, IDexterityFTI, portal_type)\n \n self.mock_adapter(\n- provider_mock,\n- IFormFieldProvider,\n- (providedBy(IBehaviorInterface), )\n+ provider_mock, IFormFieldProvider, (providedBy(IBehaviorInterface),)\n )\n \n generator = utils.getAdditionalSchemata(None, portal_type)\n@@ -53,39 +50,44 @@ class IBehaviorSchema(Interface):\n self.assertTrue(schemata is IBehaviorSchema)\n \n def testAddContentToContainer_preserves_existing_id(self):\n- from plone.dexterity.content import Item\n from plone.dexterity.content import Container\n+ from plone.dexterity.content import Item\n+\n container = Container()\n- container._ordering = u\'unordered\'\n+ container._ordering = u"unordered"\n # Allow anyone to access the contents information on the container.\n # This allows to check for existing content with the same id.\n container.manage_permission(\n- \'Access contents information\', [\'Anonymous\'], acquire=1)\n+ "Access contents information", ["Anonymous"], acquire=1\n+ )\n \n- from zope.component import provideAdapter, provideUtility\n- from zope.container.interfaces import INameChooser\n- from zope.interface import Interface\n from plone.app.content.namechooser import NormalizingNameChooser\n from plone.folder.interfaces import IOrdering\n from plone.folder.unordered import UnorderedOrdering\n- from plone.i18n.normalizer.interfaces import IURLNormalizer\n from plone.i18n.normalizer import URLNormalizer\n+ from plone.i18n.normalizer.interfaces import IURLNormalizer\n+ from zope.component import provideAdapter\n+ from zope.component import provideUtility\n+ from zope.container.interfaces import INameChooser\n+ from zope.interface import Interface\n+\n provideAdapter(NormalizingNameChooser, [Interface], INameChooser)\n provideUtility(URLNormalizer(), IURLNormalizer)\n provideAdapter(UnorderedOrdering, [Interface], IOrdering)\n \n # if the item has an id already, use it\n from plone.dexterity.utils import addContentToContainer\n+\n item = Item()\n- item.id = \'foo\'\n+ item.id = "foo"\n item = addContentToContainer(container, item, checkConstraints=False)\n- self.assertEqual(item.id, \'foo\')\n+ self.assertEqual(item.id, "foo")\n \n # unless it\'s a duplicate\n item = Item()\n- item.id = \'foo\'\n+ item.id = "foo"\n item = addContentToContainer(container, item, checkConstraints=False)\n- self.assertEqual(item.id, \'foo-1\')\n+ self.assertEqual(item.id, "foo-1")\n \n def test_all_merged_tagged_values_dict(self):\n from zope.interface import Interface\n@@ -97,23 +99,20 @@ class IIFace2(Interface):\n pass\n \n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"), {}\n )\n \n- IIFace1.setTaggedValue(\'foo\', {\'a\': 10})\n- IIFace1.setTaggedValue(\'bar\', {\'a\': 11})\n+ IIFace1.setTaggedValue("foo", {"a": 10})\n+ IIFace1.setTaggedValue("bar", {"a": 11})\n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {\'a\': 10}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"), {"a": 10}\n )\n- IIFace2.setTaggedValue(\'foo\', {\'a\': 12})\n+ IIFace2.setTaggedValue("foo", {"a": 12})\n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {\'a\': 12}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"), {"a": 12}\n )\n- IIFace2.setTaggedValue(\'foo\', {\'a\': 13, \'b\': 14})\n+ IIFace2.setTaggedValue("foo", {"a": 13, "b": 14})\n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {\'a\': 13, \'b\': 14}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"),\n+ {"a": 13, "b": 14},\n )\ndiff --git a/plone/dexterity/tests/test_views.py b/plone/dexterity/tests/test_views.py\nindex a5a6cb0..e27e728 100644\n--- a/plone/dexterity/tests/test_views.py\n+++ b/plone/dexterity/tests/test_views.py\n@@ -50,6 +50,7 @@ class TestRequest(TestRequestBase):\n """Zope 3\'s TestRequest doesn\'t support item assignment, but Zope 2\'s\n request does.\n """\n+\n def __setitem__(self, key, value):\n pass\n \n@@ -90,7 +91,6 @@ def enumerateBehaviors(self):\n \n \n class TestAddView(MockTestCase):\n-\n def test_addview_sets_form_portal_type(self):\n \n context = Container(u"container")\n@@ -110,7 +110,7 @@ def test_form_create(self):\n # FTI - returns dummy factory name\n \n fti_mock = DexterityFTI(u"testtype")\n- fti_mock.factory = u\'testfactory\'\n+ fti_mock.factory = u"testfactory"\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # The form we\'re testing\n@@ -119,6 +119,7 @@ def test_form_create(self):\n \n class ISchema(Interface):\n foo = schema.TextLine()\n+\n form.fields = Fields(ISchema)\n \n # createObject and applyChanges\n@@ -128,11 +129,12 @@ class ISchema(Interface):\n data_dummy = {u"foo": u"bar"}\n \n from zope.component import createObject\n+\n self.patch_global(createObject, return_value=obj_dummy)\n \n provideAdapter(AttributeField)\n \n- portal = self.create_dummy(getPhysicalPath=lambda: (\'\', \'site\'))\n+ portal = self.create_dummy(getPhysicalPath=lambda: ("", "site"))\n self.mock_utility(portal, ISiteRoot)\n \n self.assertEqual(obj_dummy, form.create(data_dummy))\n@@ -145,13 +147,12 @@ def test_add(self):\n obj = Mock()\n request = TestRequest()\n \n- container._setObject = Mock(return_value=u\'newid\')\n+ container._setObject = Mock(return_value=u"newid")\n container._getOb = Mock(return_value=obj)\n- container.absolute_url = Mock(\n- return_value="http://nohost/plone/container")\n+ container.absolute_url = Mock(return_value="http://nohost/plone/container")\n \n obj.id = u"newid"\n- obj.portal_type = \'testtype\'\n+ obj.portal_type = "testtype"\n \n # New object\'s FTI\n fti_mock = DexterityFTI(u"testtype")\n@@ -161,18 +162,13 @@ def test_add(self):\n # Container FTI\n container_fti_mock = DexterityFTI(u"containertype")\n container_fti_mock.allowType = Mock(return_value=True)\n- self.mock_utility(\n- container_fti_mock,\n- IDexterityFTI,\n- name=u"containertype"\n- )\n+ self.mock_utility(container_fti_mock, IDexterityFTI, name=u"containertype")\n \n container.getTypeInfo = Mock(return_value=container_fti_mock)\n \n # Name chooser\n @implementer(INameChooser)\n class NameChooser(object):\n-\n def __init__(self, context):\n pass\n \n@@ -198,12 +194,10 @@ def test_add_raises_unauthorized_if_construction_not_allowed(self):\n \n # Container FTI\n container_fti_mock = DexterityFTI(u"containertype")\n- self.mock_utility(\n- container_fti_mock, IDexterityFTI, name=u"containertype"\n- )\n+ self.mock_utility(container_fti_mock, IDexterityFTI, name=u"containertype")\n \n container.getTypeInfo = Mock(return_value=container_fti_mock)\n- obj.portal_type = \'testtype\'\n+ obj.portal_type = "testtype"\n \n form = DefaultAddForm(container, request)\n form.portal_type = u"testtype"\n@@ -216,7 +210,7 @@ def test_add_raises_value_error_if_type_not_addable(self):\n obj = Mock()\n request = TestRequest()\n \n- obj.portal_type = \'testtype\'\n+ obj.portal_type = "testtype"\n \n # New object\'s FTI\n fti_mock = DexterityFTI(u"testtype")\n@@ -226,11 +220,7 @@ def test_add_raises_value_error_if_type_not_addable(self):\n # Container FTI\n container_fti_mock = DexterityFTI(u"containertype")\n container_fti_mock.allowType = Mock(return_value=False)\n- self.mock_utility(\n- container_fti_mock,\n- IDexterityFTI,\n- name=u"containertype"\n- )\n+ self.mock_utility(container_fti_mock, IDexterityFTI, name=u"containertype")\n \n container.getTypeInfo = Mock(return_value=container_fti_mock)\n \n@@ -248,12 +238,12 @@ def test_label(self):\n context_mock = Mock()\n request_mock = TestRequest()\n \n- request_mock.form[\'disable_border\'] = True\n+ request_mock.form["disable_border"] = True\n \n # FTI\n \n fti_mock = DexterityFTI(u"testtype")\n- fti_mock.Title = Mock(return_value=u\'Test title\')\n+ fti_mock.Title = Mock(return_value=u"Test title")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # Form\n@@ -263,12 +253,12 @@ def test_label(self):\n \n label = addform.label\n self.assertEqual(u"Add ${name}", six.text_type(label))\n- self.assertEqual(u"Test title", label.mapping[\'name\'])\n+ self.assertEqual(u"Test title", label.mapping["name"])\n \n def test_schema_lookup_add(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n request_mock = TestRequest()\n \n # FTI\n@@ -277,48 +267,37 @@ def test_schema_lookup_add(self):\n fti_mock.behaviors = (\n IBehaviorOne.__identifier__,\n IBehaviorTwo.__identifier__,\n- IBehaviorThree.__identifier__\n+ IBehaviorThree.__identifier__,\n )\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n from plone.behavior.interfaces import IBehavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior 1",\n description=u"Provides test behavior",\n interface=IBehaviorOne,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorOne.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorOne.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 2",\n description=u"Provides test behavior",\n interface=IBehaviorTwo,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorTwo.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorTwo.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 3",\n description=u"Provides test behavior",\n interface=IBehaviorThree,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorThree.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorThree.__identifier__)\n \n # Form\n view = DefaultAddForm(context_mock, request_mock)\n@@ -327,31 +306,22 @@ def test_schema_lookup_add(self):\n self.assertEqual(ISchema, view.schema)\n \n # we expect here only formfieldprovider!\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n # When we register our own IBehaviorAssignable we can\n # influence what goes into the additionalSchemata. But in an Addform\n # this never grips, since its an adapter on context, and contextless\n # there is always the FTI the only valid source\n- self.mock_adapter(\n- NoBehaviorAssignable,\n- IBehaviorAssignable,\n- [Interface]\n- )\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.mock_adapter(NoBehaviorAssignable, IBehaviorAssignable, [Interface])\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n def test_fires_add_begun_event(self):\n \n # Context and request\n context_mock = self.create_dummy(\n- portal_type=u\'testtype\',\n- allowedContentTypes=lambda: [self.create_dummy(getId=lambda: \'testtype\')])\n+ portal_type=u"testtype",\n+ allowedContentTypes=lambda: [self.create_dummy(getId=lambda: "testtype")],\n+ )\n request_mock = TestRequest()\n \n # FTI\n@@ -359,16 +329,13 @@ def test_fires_add_begun_event(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n \n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -383,8 +350,8 @@ def test_update_checks_allowed_types(self):\n \n # Context and request\n context_mock = self.create_dummy(\n- portal_type=u\'testtype\',\n- allowedContentTypes=lambda: [])\n+ portal_type=u"testtype", allowedContentTypes=lambda: []\n+ )\n request_mock = TestRequest()\n \n # FTI\n@@ -392,11 +359,7 @@ def test_update_checks_allowed_types(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n \n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n@@ -409,8 +372,8 @@ def test_update_ignores_type_check_if_security_check_deferred(self):\n \n # Context and request\n context_mock = self.create_dummy(\n- portal_type=u\'testtype\',\n- allowedContentTypes=lambda: [])\n+ portal_type=u"testtype", allowedContentTypes=lambda: []\n+ )\n request_mock = TestRequest()\n alsoProvides(request_mock, IDeferSecurityCheck)\n \n@@ -419,11 +382,7 @@ def test_update_ignores_type_check_if_security_check_deferred(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n \n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n@@ -433,30 +392,29 @@ def test_update_ignores_type_check_if_security_check_deferred(self):\n try:\n view.update()\n except ValueError:\n- self.fail("Update raised Unauthorized with security checks "\n- "deferred")\n+ self.fail("Update raised Unauthorized with security checks " "deferred")\n \n def test_fires_add_cancelled_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n- context_mock.absolute_url = \\\n- lambda *a, **kw: \'http://127.0.0.1/plone/item\'\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n+ context_mock.absolute_url = lambda *a, **kw: "http://127.0.0.1/plone/item"\n request_mock = TestRequest()\n \n # mock status message\n @implementer(IStatusMessage)\n class StatusMessage(object):\n-\n def __init__(self, request):\n pass\n \n- def addStatusMessage(self, msg, type=\'\'):\n+ def addStatusMessage(self, msg, type=""):\n pass\n+\n self.mock_adapter(StatusMessage, IStatusMessage, (Interface,))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -464,12 +422,10 @@ def addStatusMessage(self, msg, type=\'\'):\n view.handleCancel(view, {})\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IAddCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IAddCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n \n \n class TestEditView(MockTestCase):\n-\n def setUp(self):\n SCHEMA_CACHE.clear()\n \n@@ -479,13 +435,13 @@ def test_label(self):\n \n # Context and request\n \n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n request_mock = TestRequest()\n \n # FTI\n \n fti_mock = DexterityFTI(u"testtype")\n- fti_mock.Title = Mock(return_value=u\'Test title\')\n+ fti_mock.Title = Mock(return_value=u"Test title")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # Form\n@@ -496,7 +452,7 @@ def test_label(self):\n \n label = editview.label\n self.assertEqual(u"Edit ${name}", six.text_type(label))\n- self.assertEqual(u"Test title", label.mapping[\'name\'])\n+ self.assertEqual(u"Test title", label.mapping["name"])\n \n def test_schema_lookup_edit(self):\n \n@@ -504,7 +460,7 @@ def test_schema_lookup_edit(self):\n class IMarker(IDexterityContent):\n pass\n \n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n alsoProvides(context_mock, IMarker)\n request_mock = TestRequest()\n \n@@ -514,48 +470,37 @@ class IMarker(IDexterityContent):\n fti_mock.behaviors = (\n IBehaviorOne.__identifier__,\n IBehaviorTwo.__identifier__,\n- IBehaviorThree.__identifier__\n+ IBehaviorThree.__identifier__,\n )\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n from plone.behavior.interfaces import IBehavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior 1",\n description=u"Provides test behavior",\n interface=IBehaviorOne,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorOne.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorOne.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 2",\n description=u"Provides test behavior",\n interface=IBehaviorTwo,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorTwo.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorTwo.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 3",\n description=u"Provides test behavior",\n interface=IBehaviorThree,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorThree.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorThree.__identifier__)\n \n # Form\n view = DefaultEditForm(context_mock, request_mock)\n@@ -564,25 +509,18 @@ class IMarker(IDexterityContent):\n self.assertEqual(ISchema, view.schema)\n \n # we expect here only formfieldprovider!\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n # When we register our own IBehaviorAssignable we can\n # influence what goes into the additionalSchemata.\n- self.mock_adapter(\n- NoBehaviorAssignable,\n- IBehaviorAssignable,\n- [IMarker]\n- )\n+ self.mock_adapter(NoBehaviorAssignable, IBehaviorAssignable, [IMarker])\n additionalSchemata = tuple(view.additionalSchemata)\n self.assertEqual(tuple(), tuple(additionalSchemata))\n \n def test_fires_edit_begun_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n request_mock = TestRequest()\n \n # FTI\n@@ -590,15 +528,12 @@ def test_fires_edit_begun_event(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -606,30 +541,29 @@ def test_fires_edit_begun_event(self):\n view.update()\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IEditBegunEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IEditBegunEvent.providedBy(notify_mock.call_args[0][0]))\n \n def test_fires_edit_cancelled_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\', title=u\'foo\')\n- context_mock.absolute_url = \\\n- lambda *a, **kw: \'http://127.0.0.1/plone/item\'\n+ context_mock = self.create_dummy(portal_type=u"testtype", title=u"foo")\n+ context_mock.absolute_url = lambda *a, **kw: "http://127.0.0.1/plone/item"\n request_mock = TestRequest()\n \n # mock status message\n @implementer(IStatusMessage)\n class StatusMessage(object):\n-\n def __init__(self, request):\n pass\n \n- def addStatusMessage(self, msg, type=\'\'):\n+ def addStatusMessage(self, msg, type=""):\n pass\n+\n self.mock_adapter(StatusMessage, IStatusMessage, (Interface,))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -637,53 +571,50 @@ def addStatusMessage(self, msg, type=\'\'):\n view.handleCancel(view, {})\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IEditCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IEditCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n \n def test_fires_edit_finished_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\', title=u\'foo\')\n- context_mock.absolute_url = \\\n- lambda *a, **kw: \'http://127.0.0.1/plone/item\'\n+ context_mock = self.create_dummy(portal_type=u"testtype", title=u"foo")\n+ context_mock.absolute_url = lambda *a, **kw: "http://127.0.0.1/plone/item"\n request_mock = TestRequest()\n \n # mock status message\n @implementer(IStatusMessage)\n class StatusMessage(object):\n-\n def __init__(self, request):\n pass\n \n- def addStatusMessage(self, msg, type=\'\'):\n+ def addStatusMessage(self, msg, type=""):\n pass\n+\n self.mock_adapter(StatusMessage, IStatusMessage, (Interface,))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n view = DefaultEditForm(context_mock, request_mock)\n view.widgets = Mock()\n- view.widgets.extract = Mock(return_value=({\'title\': u\'foo\'}, []))\n+ view.widgets.extract = Mock(return_value=({"title": u"foo"}, []))\n view.applyChanges = Mock()\n view.handleApply(view, {})\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IEditFinishedEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IEditFinishedEvent.providedBy(notify_mock.call_args[0][0]))\n \n \n class TestDefaultView(MockTestCase):\n-\n def test_schema_lookup_default_view(self):\n \n # Context and request\n class IMarker(IDexterityContent):\n pass\n \n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n alsoProvides(context_mock, IMarker)\n request_mock = TestRequest()\n \n@@ -693,48 +624,37 @@ class IMarker(IDexterityContent):\n fti_mock.behaviors = (\n IBehaviorOne.__identifier__,\n IBehaviorTwo.__identifier__,\n- IBehaviorThree.__identifier__\n+ IBehaviorThree.__identifier__,\n )\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n from plone.behavior.interfaces import IBehavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior 1",\n description=u"Provides test behavior",\n interface=IBehaviorOne,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorOne.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorOne.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 2",\n description=u"Provides test behavior",\n interface=IBehaviorTwo,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorTwo.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorTwo.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 3",\n description=u"Provides test behavior",\n interface=IBehaviorThree,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorThree.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorThree.__identifier__)\n \n # Form\n view = DefaultView(context_mock, request_mock)\n@@ -743,17 +663,10 @@ class IMarker(IDexterityContent):\n self.assertEqual(ISchema, view.schema)\n \n # we expect here only formfieldprovider!\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n # When we register our own IBehaviorAssignable we can\n # influence what goes into the additionalSchemata.\n- self.mock_adapter(\n- NoBehaviorAssignable,\n- IBehaviorAssignable,\n- [IMarker]\n- )\n+ self.mock_adapter(NoBehaviorAssignable, IBehaviorAssignable, [IMarker])\n additionalSchemata = tuple(view.additionalSchemata)\n self.assertEqual(tuple(), tuple(additionalSchemata))\ndiff --git a/plone/dexterity/tests/test_webdav.py b/plone/dexterity/tests/test_webdav.py\nindex a204e1f..b753f88 100644\n--- a/plone/dexterity/tests/test_webdav.py\n+++ b/plone/dexterity/tests/test_webdav.py\n@@ -35,10 +35,10 @@\n from zope.filerepresentation.interfaces import IFileFactory\n from zope.filerepresentation.interfaces import IRawReadFile\n from zope.filerepresentation.interfaces import IRawWriteFile\n- from zope.interface import provider\n from zope.interface import alsoProvides\n from zope.interface import implementer\n from zope.interface import Interface\n+ from zope.interface import provider\n from zope.lifecycleevent.interfaces import IObjectModifiedEvent\n from zope.publisher.browser import TestRequest\n from zope.size.interfaces import ISized\n@@ -53,20 +53,17 @@\n except ImportError:\n from mock import Mock\n \n-\n if six.PY2:\n # cope with upstream library changes in rendering the XML prolog\n XML_PROLOG = b\'\'\n else:\n XML_PROLOG = b\'\'\n \n-\n @provider(IFormFieldProvider)\n class ITestBehavior(Interface):\n foo = schema.Int()\n bar = schema.Bytes()\n \n-\n class DAVTestRequest(TestRequest):\n \n get_header = TestRequest.getHeader\n@@ -74,11 +71,9 @@ class DAVTestRequest(TestRequest):\n def _createResponse(self):\n return HTTPResponse()\n \n-\n class TestWebZope2DAVAPI(MockTestCase):\n-\n def test_get_size_no_adapter(self):\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(0, item.get_size())\n \n@@ -88,12 +83,13 @@ def __init__(self, context):\n self.context = context\n \n def sizeForSorting(self):\n- return \'lines\', 10\n+ return "lines", 10\n \n def sizeForDisplay(self):\n- \'10 lines\'\n+ "10 lines"\n+\n self.mock_adapter(SizedAdapter, ISized, (Item,))\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(0, item.get_size())\n \n@@ -103,17 +99,18 @@ def __init__(self, context):\n self.context = context\n \n def sizeForSorting(self):\n- return \'bytes\', 10\n+ return "bytes", 10\n \n def sizeForDisplay(self):\n- \'10 bytes\'\n+ "10 bytes"\n+\n self.mock_adapter(SizedAdapter, ISized, (Item,))\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(10, item.get_size())\n \n def test_content_type_no_adapter(self):\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(None, item.content_type())\n self.assertEqual(None, item.Format())\n@@ -122,49 +119,53 @@ def test_content_type_simple_adapter(self):\n class ReadFileAdapter(object):\n def __init__(self, context):\n self.context = context\n- mimeType = \'text/foo\'\n+\n+ mimeType = "text/foo"\n # others omitted\n+\n self.mock_adapter(ReadFileAdapter, IRawReadFile, (Item,))\n- item = Item(\'test\')\n+ item = Item("test")\n \n- self.assertEqual(\'text/foo\', item.content_type())\n- self.assertEqual(\'text/foo\', item.Format())\n+ self.assertEqual("text/foo", item.content_type())\n+ self.assertEqual("text/foo", item.Format())\n \n def test_get_no_adapter(self):\n- item = Item(\'test\')\n+ item = Item("test")\n \n- self.assertEqual(\'\', item.manage_DAVget())\n+ self.assertEqual("", item.manage_DAVget())\n \n def test_get_simple_adapter(self):\n class ReadFileAdapter(object):\n def __init__(self, context):\n self.context = context\n- mimeType = \'text/foo\'\n- encoding = \'latin1\'\n+\n+ mimeType = "text/foo"\n+ encoding = "latin1"\n \n def size(self):\n return 10\n \n def read(self, size=None):\n- return \'1234567890\'\n+ return "1234567890"\n+\n self.mock_adapter(ReadFileAdapter, IRawReadFile, (Item,))\n \n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n- self.assertEqual(\'1234567890\', item.manage_DAVget())\n+ self.assertEqual("1234567890", item.manage_DAVget())\n self.assertEqual(\n- \'text/foo; charset="latin1"\',\n- request.response.getHeader(\'Content-Type\')\n+ \'text/foo; charset="latin1"\', request.response.getHeader("Content-Type")\n )\n- self.assertEqual(\'10\', request.response.getHeader(\'Content-Length\'))\n+ self.assertEqual("10", request.response.getHeader("Content-Length"))\n \n def test_get_minimal_adapter(self):\n class ReadFileAdapter(object):\n def __init__(self, context):\n self.context = context\n+\n mimeType = None\n encoding = None\n \n@@ -172,24 +173,25 @@ def size(self):\n return None\n \n def read(self, size=None):\n- return \'1234567890\'\n+ return "1234567890"\n+\n self.mock_adapter(ReadFileAdapter, IRawReadFile, (Item,))\n \n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n- self.assertEqual(\'1234567890\', item.manage_DAVget())\n- self.assertEqual(None, request.response.getHeader(\'Content-Type\'))\n- self.assertEqual(None, request.response.getHeader(\'Content-Length\'))\n+ self.assertEqual("1234567890", item.manage_DAVget())\n+ self.assertEqual(None, request.response.getHeader("Content-Type"))\n+ self.assertEqual(None, request.response.getHeader("Content-Length"))\n \n def test_get_streaming(self):\n @implementer(IStreamIterator)\n class ReadFileAdapter(object):\n-\n def __init__(self, context):\n self.context = context\n+\n mimeType = None\n encoding = None\n \n@@ -197,25 +199,26 @@ def size(self):\n return 10\n \n def read(self, size=None):\n- return \'1234567890\'\n+ return "1234567890"\n \n adapterInstance = ReadFileAdapter(None)\n \n def factory(context):\n return adapterInstance\n+\n self.mock_adapter(factory, IRawReadFile, (Item,))\n \n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n self.assertEqual(adapterInstance, item.manage_DAVget())\n \n def test_put_no_adapter(self):\n- request = DAVTestRequest(environ={\'BODYFILE\': StringIO(\'\')})\n+ request = DAVTestRequest(environ={"BODYFILE": StringIO("")})\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n self.assertRaises(MethodNotAllowed, item.PUT)\n@@ -223,7 +226,7 @@ def test_put_no_adapter(self):\n def test_put_no_body(self):\n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n self.assertRaises(MethodNotAllowed, item.PUT)\n@@ -232,8 +235,9 @@ def test_put_no_content_type_header(self):\n class WriteFile(object):\n def __init__(self, context):\n self.context = context\n- self._written = \'\'\n+ self._written = ""\n self._closed = False\n+\n mimeType = None\n encoding = None\n \n@@ -250,23 +254,24 @@ def factory(context):\n \n self.mock_adapter(factory, IRawWriteFile, (Item,))\n \n- request = DAVTestRequest(environ={\'BODYFILE\': StringIO(\'data\')})\n+ request = DAVTestRequest(environ={"BODYFILE": StringIO("data")})\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n item.PUT()\n self.assertEqual(None, adapterInstance.mimeType)\n self.assertEqual(None, adapterInstance.encoding)\n- self.assertEqual(\'data\', adapterInstance._written)\n+ self.assertEqual("data", adapterInstance._written)\n self.assertEqual(True, adapterInstance._closed)\n \n def test_put_with_content_type_header_no_charset(self):\n class WriteFile(object):\n def __init__(self, context):\n self.context = context\n- self._written = \'\'\n+ self._written = ""\n self._closed = False\n+\n mimeType = None\n encoding = None\n \n@@ -290,19 +295,16 @@ def handler(event):\n self.mock_handler(handler, (IObjectModifiedEvent,))\n \n request = DAVTestRequest(\n- environ={\n- \'BODYFILE\': StringIO(\'data\'),\n- \'HTTP_CONTENT_TYPE\': \'text/foo\'\n- }\n+ environ={"BODYFILE": StringIO("data"), "HTTP_CONTENT_TYPE": "text/foo"}\n )\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n item.PUT()\n- self.assertEqual(\'text/foo\', adapterInstance.mimeType)\n+ self.assertEqual("text/foo", adapterInstance.mimeType)\n self.assertEqual(None, adapterInstance.encoding)\n- self.assertEqual(\'data\', adapterInstance._written)\n+ self.assertEqual("data", adapterInstance._written)\n self.assertEqual(True, adapterInstance._closed)\n self.assertEqual(1, len(events))\n \n@@ -310,8 +312,9 @@ def test_put_with_content_type_header_and_charset(self):\n class WriteFile(object):\n def __init__(self, context):\n self.context = context\n- self._written = \'\'\n+ self._written = ""\n self._closed = False\n+\n mimeType = None\n encoding = None\n \n@@ -336,24 +339,24 @@ def handler(event):\n \n request = DAVTestRequest(\n environ={\n- \'BODYFILE\': StringIO(\'data\'),\n- \'HTTP_CONTENT_TYPE\': \'text/foo; charset="latin1"\'\n+ "BODYFILE": StringIO("data"),\n+ "HTTP_CONTENT_TYPE": \'text/foo; charset="latin1"\',\n }\n )\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n item.PUT()\n- self.assertEqual(\'text/foo\', adapterInstance.mimeType)\n- self.assertEqual(\'latin1\', adapterInstance.encoding)\n- self.assertEqual(\'data\', adapterInstance._written)\n+ self.assertEqual("text/foo", adapterInstance.mimeType)\n+ self.assertEqual("latin1", adapterInstance.encoding)\n+ self.assertEqual("data", adapterInstance._written)\n self.assertEqual(True, adapterInstance._closed)\n self.assertEqual(1, len(events))\n \n def test_mkcol_no_adapter(self):\n- container = Container(\'container\')\n- self.assertRaises(MethodNotAllowed, container.MKCOL_handler, \'test\')\n+ container = Container("container")\n+ self.assertRaises(MethodNotAllowed, container.MKCOL_handler, "test")\n \n def test_mkcol_simple_adapter(self):\n created = []\n@@ -364,18 +367,16 @@ def __init__(self, context):\n \n def __call__(self, id):\n created.append(id)\n+\n self.mock_adapter(DirectoryFactory, IDirectoryFactory, (Container,))\n \n- container = Container(\'container\')\n- container.MKCOL_handler(\'test\')\n- self.assertEqual([\'test\'], created)\n+ container = Container("container")\n+ container.MKCOL_handler("test")\n+ self.assertEqual(["test"], created)\n \n def test_put_factory_no_adapter(self):\n- container = Container(\'container\')\n- self.assertEqual(\n- None,\n- container.PUT_factory(\'test\', \'text/foo\', \'body\')\n- )\n+ container = Container("container")\n+ self.assertEqual(None, container.PUT_factory("test", "text/foo", "body"))\n \n def test_put_factory_simple_adapter(self):\n instance = object()\n@@ -386,21 +387,19 @@ def __init__(self, context):\n \n def __call__(self, name, contentType, body):\n return instance\n+\n self.mock_adapter(FileFactory, IFileFactory, (Container,))\n- container = Container(\'container\')\n+ container = Container("container")\n self.assertEqual(\n- instance,\n- container.PUT_factory(\'test\', \'text/foo\', \'body\')\n+ instance, container.PUT_factory("test", "text/foo", "body")\n )\n \n def test_list_without_items(self):\n-\n class DummyContainer(Container):\n-\n def listFolderContents(self, filter=None):\n return []\n \n- container = DummyContainer(\'container\')\n+ container = DummyContainer("container")\n \n objects = container.listDAVObjects()\n self.assertEqual(1, len(objects))\n@@ -409,122 +408,114 @@ def listFolderContents(self, filter=None):\n self.assertEqual(container, objects[0].__parent__)\n \n def test_list_with_items(self):\n-\n class DummyContainer(Container):\n-\n def listFolderContents(self, filter=None):\n- return [Item(\'foo\')]\n+ return [Item("foo")]\n \n- container = DummyContainer(\'container\')\n+ container = DummyContainer("container")\n \n objects = container.listDAVObjects()\n self.assertEqual(2, len(objects))\n self.assertTrue(isinstance(objects[0], FolderDataResource))\n self.assertEqual(DAV_FOLDER_DATA_ID, objects[0].getId())\n self.assertEqual(container, objects[0].__parent__)\n- self.assertEqual(\'foo\', objects[1].getId())\n-\n+ self.assertEqual("foo", objects[1].getId())\n \n class TestFolderDataResource(MockTestCase):\n-\n def test_getId(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container)\n \n- self.assertEqual(\'fdata\', r.getId())\n+ self.assertEqual("fdata", r.getId())\n self.assertEqual(container, r.__parent__)\n \n def test_HEAD(self):\n-\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertEqual(response, r.HEAD(request, request.response))\n self.assertEqual(200, response.getStatus())\n- self.assertTrue(\n- response.getHeader(\'Content-Type\').startswith(\'text/foo\'))\n- self.assertEqual(\'10\', response.getHeader(\'Content-Length\'))\n+ self.assertTrue(response.getHeader("Content-Type").startswith("text/foo"))\n+ self.assertEqual("10", response.getHeader("Content-Length"))\n \n def test_OPTIONS(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertEqual(response, r.OPTIONS(request, request.response))\n self.assertEqual(\n- \'GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, PROPFIND, \'\n- \'PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK\',\n- response.getHeader(\'Allow\')\n+ "GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, PROPFIND, "\n+ "PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK",\n+ response.getHeader("Allow"),\n )\n \n def test_TRACE(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n \n self.assertRaises(MethodNotAllowed, r.TRACE, request, request.response)\n \n def test_PROPFIND(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n container.manage_changeProperties(title="Container")\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertEqual(response, r.PROPFIND(request, response))\n self.assertEqual(\n- \'text/xml; charset="utf-8"\', response.getHeader(\'Content-Type\')\n+ \'text/xml; charset="utf-8"\', response.getHeader("Content-Type")\n )\n self.assertEqual(207, response.getStatus())\n \n- body = XML_PROLOG + b"""\n+ body = (\n+ XML_PROLOG\n+ + b"""\n \n \n /site/container\n@@ -558,27 +549,27 @@ def content_type(self):\n \n \n """\n+ )\n \n result = response.getBody()\n result = re.sub(\n- br\'.+\',\n- br\'...\',\n- result\n+ br".+",\n+ br"...",\n+ result,\n )\n self.assertEqual(result.strip(), body.strip())\n \n def test_PROPPATCH(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n container.manage_changeProperties(title="Container")\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n requestBody = """\\\n \n@@ -594,22 +585,24 @@ def content_type(self):\n \n request = DAVTestRequest(\n environ={\n- \'URL\': \'http://example.org/site/container\',\n- \'BODY\': requestBody\n+ "URL": "http://example.org/site/container",\n+ "BODY": requestBody,\n }\n )\n response = request.response\n \n self.assertEqual(response, r.PROPPATCH(request, response))\n \n- self.assertEqual(\'New title\', container.getProperty(\'title\'))\n+ self.assertEqual("New title", container.getProperty("title"))\n \n self.assertEqual(\n- \'text/xml; charset="utf-8"\', response.getHeader(\'Content-Type\')\n+ \'text/xml; charset="utf-8"\', response.getHeader("Content-Type")\n )\n self.assertEqual(207, response.getStatus())\n \n- body = XML_PROLOG + b"""\n+ body = (\n+ XML_PROLOG\n+ + b"""\n \n \n http%3A//example.org/site/container\n@@ -625,6 +618,7 @@ def content_type(self):\n \n \n """\n+ )\n \n result = response.getBody()\n \n@@ -633,16 +627,18 @@ def content_type(self):\n def test_LOCK(self):\n # Too much WebDAV magic - just test that it delegates correctly\n class TestContainer(Container):\n-\n def LOCK(self, request, response):\n- self._locked = (request, response,)\n+ self._locked = (\n+ request,\n+ response,\n+ )\n return response\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -652,16 +648,18 @@ def LOCK(self, request, response):\n def test_UNLOCK(self):\n # Too much WebDAV magic - just test that it delegates correctly\n class TestContainer(Container):\n-\n def UNLOCK(self, request, response):\n- self._unlocked = (request, response,)\n+ self._unlocked = (\n+ request,\n+ response,\n+ )\n return response\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -670,16 +668,18 @@ def UNLOCK(self, request, response):\n \n def test_PUT(self):\n class TestContainer(Container):\n-\n def PUT(self, request, response):\n- self._put = (request, response,)\n+ self._put = (\n+ request,\n+ response,\n+ )\n return response\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -687,44 +687,44 @@ def PUT(self, request, response):\n self.assertEqual((request, response), container._put)\n \n def test_MKCOL(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertRaises(MethodNotAllowed, r.MKCOL, request, response)\n \n def test_DELETE(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertRaises(MethodNotAllowed, r.DELETE, request, response)\n \n def test_COPY(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertRaises(MethodNotAllowed, r.COPY, request, response)\n \n def test_MOVE(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -732,118 +732,102 @@ def test_MOVE(self):\n \n def test_manage_DAVget(self):\n class TestContainer(Container):\n-\n def manage_DAVget(self):\n- return \'data\'\n+ return "data"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n- self.assertEqual(\'data\', r.manage_DAVget())\n+ self.assertEqual("data", r.manage_DAVget())\n \n def test_manage_FTPget(self):\n class TestContainer(Container):\n def manage_FTPget(self):\n- return \'data\'\n+ return "data"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n- self.assertEqual(\'data\', r.manage_FTPget())\n+ self.assertEqual("data", r.manage_FTPget())\n \n def test_listDAVObjects(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n self.assertEqual([], r.listDAVObjects())\n \n-\n class TestFileRepresentation(MockTestCase):\n-\n def create_dummy(self, **kw):\n return ItemDummy(**kw)\n \n def test_directory_factory(self):\n class TestContainer(Container):\n-\n def manage_addFolder(self, name):\n self._added = name\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n factory = DefaultDirectoryFactory(container)\n \n- factory(\'foo\')\n- self.assertEqual(\'foo\', container._added)\n+ factory("foo")\n+ self.assertEqual("foo", container._added)\n \n def test_file_factory_finder_cruft(self):\n- container = Container(\'container\')\n+ container = Container("container")\n factory = DefaultFileFactory(container)\n \n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'.DS_Store\',\n- \'application/octet-stream\',\n- \'xxx\'\n+ Unauthorized, factory, ".DS_Store", "application/octet-stream", "xxx"\n )\n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'._test\',\n- \'application/octet-stream\',\n- \'xxx\'\n+ Unauthorized, factory, "._test", "application/octet-stream", "xxx"\n )\n \n def test_file_factory_no_ctr(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n from Products.CMFCore.utils import getToolByName\n+\n self.patch_global(getToolByName, return_value=None)\n \n factory = DefaultFileFactory(container)\n \n- self.assertEqual(None, factory(\'test.html\', \'text/html\', \'\'))\n+ self.assertEqual(None, factory("test.html", "text/html", ""))\n \n def test_file_factory_no_fti(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n ctr_mock = Mock()\n ctr_mock.findTypeName = Mock(return_value=None)\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n+ self.mock_tool(ctr_mock, "content_type_registry")\n \n factory = DefaultFileFactory(container)\n \n- self.assertEqual(None, factory(\'test.html\', \'text/html\', \'\'))\n+ self.assertEqual(None, factory("test.html", "text/html", ""))\n \n def test_file_factory_not_allowed(self):\n- container = Container(\'container\')\n- container.portal_type = \'containertype\'\n+ container = Container("container")\n+ container.portal_type = "containertype"\n \n child_fti_mock = Mock()\n child_fti_mock.product = None\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=False)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n factory = DefaultFileFactory(container)\n \n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'test.html\',\n- \'text/html\',\n- \'\'\n+ Unauthorized, factory, "test.html", "text/html", ""\n )\n \n def test_file_factory_construction_not_allowed(self):\n- container = Container(\'container\')\n- container.portal_type = \'containertype\'\n+ container = Container("container")\n+ container.portal_type = "containertype"\n \n child_fti_mock = Mock()\n child_fti_mock.product = None\n@@ -851,180 +835,171 @@ def test_file_factory_construction_not_allowed(self):\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=True)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n factory = DefaultFileFactory(container)\n \n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'test.html\',\n- \'text/html\',\n- \'\'\n+ Unauthorized, factory, "test.html", "text/html", ""\n )\n \n def test_file_factory_factory_method(self):\n result_dummy = self.create_dummy()\n container_mock = Mock()\n- container_mock.invokeFactory = Mock(return_value=\'test-1.html\')\n+ container_mock.invokeFactory = Mock(return_value="test-1.html")\n container_mock._getOb = Mock(return_value=result_dummy)\n container_mock._delObject = Mock()\n child_fti_mock = Mock()\n- child_fti_mock.product = \'FooProduct\'\n+ child_fti_mock.product = "FooProduct"\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n pt_mock.getTypeInfo = Mock(return_value=child_fti_mock)\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n factory = DefaultFileFactory(container_mock)\n \n self.assertEqual(\n- result_dummy,\n- factory(\'test.html\', \'text/html\', \'\')\n+ result_dummy, factory("test.html", "text/html", "")\n )\n \n def test_file_factory_factory_utility(self):\n- result_dummy = self.create_dummy(id=\'test.html\')\n+ result_dummy = self.create_dummy(id="test.html")\n container_mock = Mock()\n child_fti_mock = Mock()\n child_fti_mock.isConstructionAllowed = Mock(return_value=True)\n child_fti_mock.product = None\n- child_fti_mock.factory = \'childtype-factory\'\n+ child_fti_mock.factory = "childtype-factory"\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=True)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n def factory(*args, **kwargs):\n return result_dummy\n- self.mock_utility(factory, IFactory, name=u\'childtype-factory\')\n+\n+ self.mock_utility(factory, IFactory, name=u"childtype-factory")\n \n factory = DefaultFileFactory(container_mock)\n \n self.assertEqual(\n- result_dummy,\n- factory(\'test.html\', \'text/html\', \'\')\n+ result_dummy, factory("test.html", "text/html", "")\n )\n- self.assertEqual(result_dummy.Title(), \'test.html\')\n+ self.assertEqual(result_dummy.Title(), "test.html")\n \n def test_file_factory_content_type_factory_utility(self):\n container_mock = Mock()\n child_fti_mock = Mock()\n child_fti_mock.isConstructionAllowed = Mock(return_value=True)\n- child_fti_mock.getId = Mock(return_value=\'childtype\')\n+ child_fti_mock.getId = Mock(return_value="childtype")\n child_fti_mock.product = None\n- child_fti_mock.factory = \'childtype-factory\'\n+ child_fti_mock.factory = "childtype-factory"\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=True)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n def factory(*args, **kwargs):\n return Item(*args, **kwargs)\n- self.mock_utility(factory, IFactory, name=u\'childtype-factory\')\n+\n+ self.mock_utility(factory, IFactory, name=u"childtype-factory")\n \n factory = DefaultFileFactory(container_mock)\n \n- item = factory(\'test.html\', \'text/html\', \'\')\n+ item = factory("test.html", "text/html", "")\n \n- self.assertEqual(\'test.html\', item.id)\n+ self.assertEqual("test.html", item.id)\n \n def test_readfile_mimetype_no_message_no_fields(self):\n-\n class ITest(Interface):\n pass\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = []\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n def test_readfile_mimetype_no_message_no_primary_field(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = []\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n def test_readfile_mimetype_no_message_single_primary_field(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n+\n+ alsoProvides(ITest["body"], IPrimaryField)\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = []\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n def test_readfile_mimetype_no_message_multiple_primary_fields(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n stuff = schema.Bytes()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n- alsoProvides(ITest[\'stuff\'], IPrimaryField)\n+\n+ alsoProvides(ITest["body"], IPrimaryField)\n+ alsoProvides(ITest["stuff"], IPrimaryField)\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'message/rfc822\', readfile.mimeType)\n+ self.assertEqual("message/rfc822", readfile.mimeType)\n \n def test_readfile_mimetype_additional_schemata(self):\n # This is mostly a test that utils.iterSchemata takes\n@@ -1037,8 +1012,9 @@ class ITestAdditional(Interface):\n # Additional behavior on an item\n body = schema.Text()\n stuff = schema.Bytes()\n- alsoProvides(ITestAdditional[\'body\'], IPrimaryField)\n- alsoProvides(ITestAdditional[\'stuff\'], IPrimaryField)\n+\n+ alsoProvides(ITestAdditional["body"], IPrimaryField)\n+ alsoProvides(ITestAdditional["stuff"], IPrimaryField)\n alsoProvides(ITestAdditional, IFormFieldProvider)\n \n class MockBehavior(object):\n@@ -1053,44 +1029,44 @@ def enumerateBehaviors(self):\n yield MockBehavior(ITestAdditional)\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n \n- self.mock_adapter(MockBehaviorAssignable, IBehaviorAssignable,\n- (Item, ))\n+ self.mock_adapter(MockBehaviorAssignable, IBehaviorAssignable, (Item,))\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'message/rfc822\', readfile.mimeType)\n+ self.assertEqual("message/rfc822", readfile.mimeType)\n \n def test_readfile_operations(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n \n- fti_mock = DexterityFTI(u\'testtype\')\n+ alsoProvides(ITest["body"], IPrimaryField)\n+\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n message = Message()\n- message[\'title\'] = \'Test title\'\n- message[\'foo\'] = \'10\'\n- message[\'bar\'] = \'xyz\'\n- message.set_payload(\'

body

\')\n+ message["title"] = "Test title"\n+ message["foo"] = "10"\n+ message["bar"] = "xyz"\n+ message.set_payload("

body

")\n \n from plone.rfc822 import constructMessageFromSchemata\n+\n self.patch_global(constructMessageFromSchemata, return_value=message)\n \n body = b"""\\\n@@ -1106,54 +1082,54 @@ class ITest(Interface):\n \n self.assertEqual(body, readfile.read())\n self.assertEqual(69, readfile.size())\n- self.assertEqual(\'utf-8\', readfile.encoding)\n+ self.assertEqual("utf-8", readfile.encoding)\n self.assertEqual(None, readfile.name)\n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n readfile.seek(2)\n self.assertEqual(2, readfile.tell())\n- self.assertEqual(b\'tl\', readfile.read(2))\n+ self.assertEqual(b"tl", readfile.read(2))\n self.assertEqual(4, readfile.tell())\n \n readfile.seek(0, 2)\n self.assertEqual(69, readfile.tell())\n \n readfile.seek(0)\n- self.assertEqual(b\'foo: 10\\n\', readfile.readlines()[1])\n+ self.assertEqual(b"foo: 10\\n", readfile.readlines()[1])\n \n readfile.seek(0)\n- self.assertEqual(b\'foo: 10\\n\', readfile.readlines(100)[1])\n+ self.assertEqual(b"foo: 10\\n", readfile.readlines(100)[1])\n \n readfile.seek(0)\n- self.assertEqual(b\'title: Test title\\n\', readfile.readline())\n+ self.assertEqual(b"title: Test title\\n", readfile.readline())\n \n readfile.seek(0)\n- self.assertEqual(b\'title: Test title\\n\', readfile.readline(100))\n+ self.assertEqual(b"title: Test title\\n", readfile.readline(100))\n \n readfile.seek(0)\n- self.assertEqual(b\'foo: 10\\n\', list(iter(readfile))[1])\n+ self.assertEqual(b"foo: 10\\n", list(iter(readfile))[1])\n \n self.assertEqual(False, readfile.closed)\n readfile.close()\n \n def test_writefile_file_operations(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n \n- fti_mock = DexterityFTI(u\'testtype\')\n+ alsoProvides(ITest["body"], IPrimaryField)\n+\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n item.title = u"Test title"\n item.foo = 10\n- item.bar = \'xyz\'\n+ item.bar = "xyz"\n item.body = u"

body

"\n \n writefile = DefaultWriteFile(item)\n@@ -1167,21 +1143,22 @@ class ITest(Interface):\n

body

"""\n \n from plone.rfc822 import initializeObjectFromSchemata\n+\n self.patch_global(initializeObjectFromSchemata)\n \n- writefile.mimeType = \'text/plain\'\n- self.assertEqual(\'text/plain\', writefile.mimeType)\n+ writefile.mimeType = "text/plain"\n+ self.assertEqual("text/plain", writefile.mimeType)\n \n- writefile.encoding = \'latin1\'\n- self.assertEqual(\'latin1\', writefile.encoding)\n+ writefile.encoding = "latin1"\n+ self.assertEqual("latin1", writefile.encoding)\n \n- writefile.filename = \'test.html\'\n- self.assertEqual(\'test.html\', writefile.filename)\n+ writefile.filename = "test.html"\n+ self.assertEqual("test.html", writefile.filename)\n \n self.assertEqual(False, writefile.closed)\n self.assertEqual(0, writefile.tell())\n \n- writefile.writelines([\'one\\n\', \'two\'])\n+ writefile.writelines(["one\\n", "two"])\n self.assertEqual(7, writefile.tell())\n \n self.assertRaises(NotImplementedError, writefile.truncate)\n@@ -1198,55 +1175,48 @@ class ITest(Interface):\n self.assertEqual(True, writefile.closed)\n self.assertEqual(69, writefile.tell())\n \n-\n class TestDAVTraversal(MockTestCase):\n-\n def test_no_acquire_dav(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n- outer = Folder(\'outer\')\n- outer._setOb(\'item\', SimpleItem(\'item\'))\n- outer._setOb(\'container\', container)\n+ outer = Folder("outer")\n+ outer._setOb("item", SimpleItem("item"))\n+ outer._setOb("container", container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'PUT\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "PUT"}\n )\n request.maybe_webdav_client = True\n \n- traversal = DexterityPublishTraverse(\n- container.__of__(outer),\n- request\n- )\n+ traversal = DexterityPublishTraverse(container.__of__(outer), request)\n \n- r = traversal.publishTraverse(request, \'item\')\n+ r = traversal.publishTraverse(request, "item")\n \n self.assertTrue(isinstance(r, NullResource))\n self.assertEqual(container, r.aq_parent)\n \n def test_acquire_without_dav(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n- outer = Folder(\'outer\')\n- outer._setObject(\'item\', SimpleItem(\'item\'))\n- outer._setOb(\'container\', container)\n+ outer = Folder("outer")\n+ outer._setObject("item", SimpleItem("item"))\n+ outer._setOb("container", container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'GET\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "GET"}\n )\n request.maybe_webdav_client = False\n \n traversal = DexterityPublishTraverse(container.__of__(outer), request)\n \n- r = traversal.publishTraverse(request, \'item\')\n+ r = traversal.publishTraverse(request, "item")\n \n- self.assertEqual(r.aq_base, outer[\'item\'].aq_base)\n+ self.assertEqual(r.aq_base, outer["item"].aq_base)\n self.assertEqual(container, r.aq_parent)\n \n def test_folder_data_traversal_dav(self):\n- container = Container(\'test\')\n- request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\'}\n- )\n+ container = Container("test")\n+ request = DAVTestRequest(environ={"URL": "http://site/test"})\n request.maybe_webdav_client = True\n \n traversal = DexterityPublishTraverse(container, request)\n@@ -1258,77 +1228,82 @@ def test_folder_data_traversal_dav(self):\n self.assertEqual(container, r.aq_parent)\n \n def test_folder_data_traversal_without_dav(self):\n- container = Container(\'test\')\n- request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\'}\n- )\n+ container = Container("test")\n+ request = DAVTestRequest(environ={"URL": "http://site/test"})\n request.maybe_webdav_client = False\n \n traversal = DexterityPublishTraverse(container, request)\n \n self.assertRaises(\n- Forbidden,\n- traversal.publishTraverse,\n- request,\n- DAV_FOLDER_DATA_ID\n+ Forbidden, traversal.publishTraverse, request, DAV_FOLDER_DATA_ID\n )\n \n def test_browser_default_dav(self):\n class TestContainer(Container):\n-\n def __browser_default__(self, request):\n- return self, (\'foo\',)\n+ return self, ("foo",)\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'PROPFIND\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "PROPFIND"}\n )\n request.maybe_webdav_client = True\n \n traversal = DexterityPublishTraverse(container, request)\n \n- self.assertEqual((container, (),), traversal.browserDefault(request))\n+ self.assertEqual(\n+ (\n+ container,\n+ (),\n+ ),\n+ traversal.browserDefault(request),\n+ )\n \n def test_browser_default_dav_get(self):\n class TestContainer(Container):\n-\n def __browser_default__(self, request):\n- return self, (\'foo\',)\n+ return self, ("foo",)\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'GET\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "GET"}\n )\n request.maybe_webdav_client = True\n \n traversal = DexterityPublishTraverse(container, request)\n \n self.assertEqual(\n- (container, (\'foo\',),),\n- traversal.browserDefault(request)\n+ (\n+ container,\n+ ("foo",),\n+ ),\n+ traversal.browserDefault(request),\n )\n \n def test_browser_default_without_dav(self):\n class TestContainer(Container):\n-\n def __browser_default__(self, request):\n- return self, (\'foo\',)\n+ return self, ("foo",)\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'PROPFIND\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "PROPFIND"}\n )\n request.maybe_webdav_client = False\n \n traversal = DexterityPublishTraverse(container, request)\n \n self.assertEqual(\n- (container, (\'foo\',),),\n- traversal.browserDefault(request)\n+ (\n+ container,\n+ ("foo",),\n+ ),\n+ traversal.browserDefault(request),\n )\n \n+\n else:\n- class TestDummy(MockTestCase):\n \n+ class TestDummy(MockTestCase):\n def test_dummy(self):\n pass\ndiff --git a/plone/dexterity/utils.py b/plone/dexterity/utils.py\nindex 87b33f9..745a394 100644\n--- a/plone/dexterity/utils.py\n+++ b/plone/dexterity/utils.py\n@@ -27,18 +27,10 @@\n import six\n \n \n-deprecation.deprecated(\n- \'SchemaNameEncoder\',\n- \'moved to plone.dexterity.schema\')\n-deprecation.deprecated(\n- \'portalTypeToSchemaName\',\n- \'moved to plone.dexterity.schema\')\n-deprecation.deprecated(\n- \'schemaNameToPortalType\',\n- \'moved to plone.dexterity.schema\')\n-deprecation.deprecated(\n- \'splitSchemaName\',\n- \'moved to plone.dexterity.schema\')\n+deprecation.deprecated("SchemaNameEncoder", "moved to plone.dexterity.schema")\n+deprecation.deprecated("portalTypeToSchemaName", "moved to plone.dexterity.schema")\n+deprecation.deprecated("schemaNameToPortalType", "moved to plone.dexterity.schema")\n+deprecation.deprecated("splitSchemaName", "moved to plone.dexterity.schema")\n \n log = logging.getLogger(__name__)\n \n@@ -47,8 +39,7 @@\n \n \n def resolveDottedName(dottedName):\n- """Resolve a dotted name to a real object\n- """\n+ """Resolve a dotted name to a real object"""\n global _dottedCache\n if dottedName not in _dottedCache:\n _dottedCache[dottedName] = resolve(dottedName)\n@@ -91,8 +82,9 @@ def getAdditionalSchemata(context=None, portal_type=None):\n are set, the portal_type might get ignored, depending on which\n code path is taken.\n """\n- log.debug("getAdditionalSchemata with context %r and portal_type %s",\n- context, portal_type)\n+ log.debug(\n+ "getAdditionalSchemata with context %r and portal_type %s", context, portal_type\n+ )\n if context is None and portal_type is None:\n return\n if context:\n@@ -104,9 +96,7 @@ def getAdditionalSchemata(context=None, portal_type=None):\n # Usually an add-form.\n if portal_type is None:\n portal_type = context.portal_type\n- for schema_interface in SCHEMA_CACHE.behavior_schema_interfaces(\n- portal_type\n- ):\n+ for schema_interface in SCHEMA_CACHE.behavior_schema_interfaces(portal_type):\n form_schema = IFormFieldProvider(schema_interface, None)\n if form_schema is not None:\n yield form_schema\n@@ -176,13 +166,12 @@ def addContentToContainer(container, object, checkConstraints=True):\n if not fti.isConstructionAllowed(container):\n raise Unauthorized("Cannot create %s" % object.portal_type)\n \n- if container_fti is not None \\\n- and not container_fti.allowType(object.portal_type):\n- raise ValueError(\n- "Disallowed subobject type: %s" % object.portal_type\n- )\n+ if container_fti is not None and not container_fti.allowType(\n+ object.portal_type\n+ ):\n+ raise ValueError("Disallowed subobject type: %s" % object.portal_type)\n \n- name = getattr(aq_base(object), \'id\', None)\n+ name = getattr(aq_base(object), "id", None)\n name = INameChooser(container).chooseName(name, object)\n object.id = name\n \n@@ -194,35 +183,30 @@ def addContentToContainer(container, object, checkConstraints=True):\n return uuidToObject(uuid)\n \n \n-def createContentInContainer(container, portal_type, checkConstraints=True,\n- **kw):\n+def createContentInContainer(container, portal_type, checkConstraints=True, **kw):\n content = createContent(portal_type, **kw)\n- return addContentToContainer(\n- container,\n- content,\n- checkConstraints=checkConstraints\n- )\n+ return addContentToContainer(container, content, checkConstraints=checkConstraints)\n \n \n def safe_utf8(st):\n if isinstance(st, six.text_type):\n- st = st.encode(\'utf8\')\n+ st = st.encode("utf8")\n return st\n \n \n def safe_unicode(st):\n if isinstance(st, six.binary_type):\n- st = st.decode(\'utf8\')\n+ st = st.decode("utf8")\n return st\n \n \n def datify(in_date):\n """Get a DateTime object from a string (or anything parsable by DateTime,\n- a datetime.date, a datetime.datetime\n+ a datetime.date, a datetime.datetime\n """\n if isinstance(in_date, DateTime):\n return in_date\n- if in_date == \'None\':\n+ if in_date == "None":\n in_date = None\n elif isinstance(in_date, datetime.datetime):\n in_date = DateTime(in_date)\n' - -Repository: plone.dexterity +M plone/app/z3cform/configure.zcml + +b'diff --git a/plone/app/z3cform/configure.zcml b/plone/app/z3cform/configure.zcml\nindex 7e2d547..ed6cbdc 100644\n--- a/plone/app/z3cform/configure.zcml\n+++ b/plone/app/z3cform/configure.zcml\n@@ -174,7 +174,11 @@\n \n \n \n+ \n \n+ \n \n \n \n' + +Repository: plone.app.z3cform Branch: refs/heads/master -Date: 2021-08-11T23:58:24+02:00 -Author: Jens W. Klein (jensens) -Commit: https://github.com/plone/plone.dexterity/commit/12101f63f2b535907e731d0eaf0f43efef2b6efb +Date: 2021-01-30T17:58:38-08:00 +Author: Alec Mitchell (alecpm) +Commit: https://github.com/plone/plone.app.z3cform/commit/73f28f9b84fd794493f765d9956b70b83eba2d6e + +Register additional Relation data converters for use with Select, AJAXSelect, and CheckBox widgets, among others. Add support for non-named vocabularies to AJAXSelectWidget. + +Files changed: +M plone/app/z3cform/configure.zcml +M plone/app/z3cform/converters.py +M plone/app/z3cform/widget.py -Merge pull request #154 from plone/codestyle +b'diff --git a/plone/app/z3cform/configure.zcml b/plone/app/z3cform/configure.zcml\nindex ed6cbdc..f101325 100644\n--- a/plone/app/z3cform/configure.zcml\n+++ b/plone/app/z3cform/configure.zcml\n@@ -174,11 +174,13 @@\n \n \n \n- \n- \n \n+ for="z3c.relationfield.interfaces.IRelationChoice .interfaces.ITextWidget" />\n+ \n+ \n+ \n+ \n \n \n \ndiff --git a/plone/app/z3cform/converters.py b/plone/app/z3cform/converters.py\nindex c74a93e..10f7765 100644\n--- a/plone/app/z3cform/converters.py\n+++ b/plone/app/z3cform/converters.py\n@@ -17,7 +17,8 @@\n from z3c.form.converter import BaseDataConverter\n from z3c.form.converter import CollectionSequenceDataConverter\n from z3c.form.converter import SequenceDataConverter\n-from z3c.relationfield.interfaces import IRelationChoice\n+from z3c.form.interfaces import ISequenceWidget\n+from z3c.relationfield.interfaces import IRelation\n from z3c.relationfield.interfaces import IRelationList\n from zope.component import adapter\n from zope.component.hooks import getSite\n@@ -224,7 +225,7 @@ def toFieldValue(self, value):\n return collectionType(untokenized_value)\n \n \n-@adapter(IRelationChoice, IRelatedItemsWidget)\n+@adapter(IRelation, IRelatedItemsWidget)\n class RelationChoiceRelatedItemsWidgetConverter(BaseDataConverter):\n """Data converter for RelationChoice fields using the RelatedItemsWidget.\n """\n@@ -249,6 +250,19 @@ def toFieldValue(self, value):\n return self.field.missing_value\n \n \n+@adapter(IRelation, ISequenceWidget)\n+class RelationChoiceSelectWidgetConverter(RelationChoiceRelatedItemsWidgetConverter):\n+ """Data converter for RelationChoice fields using with SequenceWidgets,\n+ which expect sequence values.\n+ """\n+\n+ def toWidgetValue(self, value):\n+ if not value:\n+ missing = self.field.missing_value\n+ return [] if missing is None else missing\n+ return [IUUID(value)]\n+\n+\n @adapter(ICollection, IRelatedItemsWidget)\n class RelatedItemsDataConverter(BaseDataConverter):\n """Data converter for ICollection fields using the RelatedItemsWidget."""\n@@ -287,7 +301,9 @@ def toFieldValue(self, value):\n collectionType = collectionType[-1]\n \n separator = getattr(self.widget, \'separator\', \';\')\n- value = value.split(separator)\n+ # Some widgets (like checkbox) return lists\n+ if isinstance(value, six.string_types):\n+ value = value.split(separator)\n \n if IRelationList.providedBy(self.field):\n try:\n@@ -311,6 +327,30 @@ def toFieldValue(self, value):\n return collectionType(valueType(v) for v in value)\n \n \n+@adapter(IRelationList, ISequenceWidget)\n+class RelationListSelectWidgetDataConverter(RelatedItemsDataConverter):\n+ """Data converter for RelationChoice fields using with SequenceWidgets,\n+ which expect sequence values.\n+ """\n+\n+ def toWidgetValue(self, value):\n+ """Converts from field value to widget.\n+\n+ :param value: List of catalog brains.\n+ :type value: list\n+\n+ :returns: List of of UID.\n+ :rtype: list\n+ """\n+ if not value:\n+ missing = self.field.missing_value\n+ return [] if missing is None else missing\n+ if IRelationList.providedBy(self.field):\n+ return [IUUID(o) for o in value if o]\n+ else:\n+ return [v for v in value if v]\n+\n+\n @adapter(IList, IQueryStringWidget)\n class QueryStringDataConverter(BaseDataConverter):\n """Data converter for IList."""\ndiff --git a/plone/app/z3cform/widget.py b/plone/app/z3cform/widget.py\nindex 18d1bdd..97b7efe 100644\n--- a/plone/app/z3cform/widget.py\n+++ b/plone/app/z3cform/widget.py\n@@ -391,13 +391,14 @@ def _view_context(self):\n return view_context\n \n def get_vocabulary(self):\n- if self.vocabulary:\n+ if self.vocabulary and isinstance(self.vocabulary, six.text_type):\n factory = queryUtility(\n IVocabularyFactory,\n self.vocabulary,\n )\n if factory:\n return factory(self._view_context())\n+ return self.vocabulary\n \n def display_items(self):\n if self.value:\n' -Black & Isort +Repository: plone.app.z3cform + + +Branch: refs/heads/master +Date: 2021-02-28T20:05:19-08:00 +Author: Alec Mitchell (alecpm) +Commit: https://github.com/plone/plone.app.z3cform/commit/055daf9680fc3652249db2d41022bb0aad2d51aa + +Add changelog entry. Files changed: -A news/154.bugfix -M plone/__init__.py -M plone/dexterity/bbb.py -M plone/dexterity/behavior.py -M plone/dexterity/browser/add.py -M plone/dexterity/browser/base.py -M plone/dexterity/browser/edit.py -M plone/dexterity/browser/fti.py -M plone/dexterity/browser/traversal.py -M plone/dexterity/content.py -M plone/dexterity/events.py -M plone/dexterity/exportimport.py -M plone/dexterity/factory.py -M plone/dexterity/filerepresentation.py -M plone/dexterity/fti.py -M plone/dexterity/interfaces.py -M plone/dexterity/primary.py -M plone/dexterity/schema.py -M plone/dexterity/tests/case.py -M plone/dexterity/tests/schemata.py -M plone/dexterity/tests/test_behavior.py -M plone/dexterity/tests/test_content.py -M plone/dexterity/tests/test_content_integration.py -M plone/dexterity/tests/test_exportimport.py -M plone/dexterity/tests/test_factory.py -M plone/dexterity/tests/test_fti.py -M plone/dexterity/tests/test_primary.py -M plone/dexterity/tests/test_schema.py -M plone/dexterity/tests/test_schema_cache.py -M plone/dexterity/tests/test_security.py -M plone/dexterity/tests/test_utils.py -M plone/dexterity/tests/test_views.py -M plone/dexterity/tests/test_webdav.py -M plone/dexterity/utils.py - -b'diff --git a/news/154.bugfix b/news/154.bugfix\nnew file mode 100644\nindex 0000000..3e27c41\n--- /dev/null\n+++ b/news/154.bugfix\n@@ -0,0 +1 @@\n+Codestyle black and isort [jensens]\ndiff --git a/plone/__init__.py b/plone/__init__.py\nindex 68c04af..03d08ff 100644\n--- a/plone/__init__.py\n+++ b/plone/__init__.py\n@@ -1,2 +1,2 @@\n # -*- coding: utf-8 -*-\n-__import__(\'pkg_resources\').declare_namespace(__name__)\n+__import__("pkg_resources").declare_namespace(__name__)\ndiff --git a/plone/dexterity/bbb.py b/plone/dexterity/bbb.py\nindex d92c75f..9b3770e 100644\n--- a/plone/dexterity/bbb.py\n+++ b/plone/dexterity/bbb.py\n@@ -27,6 +27,7 @@ def dav__init(self, request, response):\n def dav__validate(self, object, methodname, REQUEST):\n pass\n \n- def dav__simpleifhandler(self, request, response, method=\'PUT\',\n- col=0, url=None, refresh=0):\n+ def dav__simpleifhandler(\n+ self, request, response, method="PUT", col=0, url=None, refresh=0\n+ ):\n pass\ndiff --git a/plone/dexterity/behavior.py b/plone/dexterity/behavior.py\nindex 35405a6..bf015f3 100644\n--- a/plone/dexterity/behavior.py\n+++ b/plone/dexterity/behavior.py\n@@ -9,8 +9,7 @@\n @implementer(IBehaviorAssignable)\n @adapter(IDexterityContent)\n class DexterityBehaviorAssignable(object):\n- """Support plone.behavior behaviors stored in the FTI\n- """\n+ """Support plone.behavior behaviors stored in the FTI"""\n \n def __init__(self, context):\n self.context = context\n@@ -22,7 +21,5 @@ def supports(self, behavior_interface):\n return False\n \n def enumerateBehaviors(self):\n- for behavior in SCHEMA_CACHE.behavior_registrations(\n- self.context.portal_type\n- ):\n+ for behavior in SCHEMA_CACHE.behavior_registrations(self.context.portal_type):\n yield behavior\ndiff --git a/plone/dexterity/browser/add.py b/plone/dexterity/browser/add.py\nindex 0c05d86..7308769 100644\n--- a/plone/dexterity/browser/add.py\n+++ b/plone/dexterity/browser/add.py\n@@ -44,7 +44,7 @@ def __init__(self, context, request, ti=None):\n if ti is not None:\n self.ti = ti\n self.portal_type = ti.getId()\n- self.request.form[\'disable_border\'] = True\n+ self.request.form["disable_border"] = True\n \n @property\n def additionalSchemata(self):\n@@ -71,7 +71,7 @@ def create(self, data):\n # to re-define a type through the web that uses the factory from an\n # existing type, but wants a unique portal_type!\n \n- if hasattr(content, \'_setPortalTypeName\'):\n+ if hasattr(content, "_setPortalTypeName"):\n content._setPortalTypeName(fti.getId())\n \n # Acquisition wrap temporarily to satisfy things like vocabularies\n@@ -107,7 +107,7 @@ def nextURL(self):\n \n # Buttons\n \n- @button.buttonAndHandler(_(\'Save\'), name=\'save\')\n+ @button.buttonAndHandler(_("Save"), name="save")\n def handleAdd(self, action):\n data, errors = self.extractData()\n if errors:\n@@ -117,11 +117,9 @@ def handleAdd(self, action):\n if obj is not None:\n # mark only as finished if we get the new object\n self._finishedAdd = True\n- IStatusMessage(self.request).addStatusMessage(\n- self.success_message, "info"\n- )\n+ IStatusMessage(self.request).addStatusMessage(self.success_message, "info")\n \n- @button.buttonAndHandler(_(u\'Cancel\'), name=\'cancel\')\n+ @button.buttonAndHandler(_(u"Cancel"), name="cancel")\n def handleCancel(self, action):\n IStatusMessage(self.request).addStatusMessage(\n _(u"Add New Item operation cancelled"), "info"\n@@ -131,11 +129,10 @@ def handleCancel(self, action):\n \n def update(self):\n if not IDeferSecurityCheck.providedBy(self.request):\n- allowed_ids = [fti.getId() for fti in\n- self.context.allowedContentTypes()]\n+ allowed_ids = [fti.getId() for fti in self.context.allowedContentTypes()]\n if self.portal_type not in allowed_ids:\n raise ValueError(\n- \'Subobject type disallowed by IConstrainTypes adapter: %s\'\n+ "Subobject type disallowed by IConstrainTypes adapter: %s"\n % self.portal_type\n )\n super(DefaultAddForm, self).update()\n@@ -145,10 +142,10 @@ def update(self):\n \n def updateActions(self):\n super(DefaultAddForm, self).updateActions()\n- if \'save\' in self.actions:\n+ if "save" in self.actions:\n self.actions["save"].addClass("context")\n \n- if \'cancel\' in self.actions:\n+ if "cancel" in self.actions:\n self.actions["cancel"].addClass("standalone")\n \n @property\n@@ -156,7 +153,7 @@ def label(self):\n portal_type = self.portal_type\n fti = getUtility(IDexterityFTI, name=portal_type)\n type_name = fti.Title()\n- return _(u"Add ${name}", mapping={\'name\': type_name})\n+ return _(u"Add ${name}", mapping={"name": type_name})\n \n \n class DefaultAddView(layout.FormWrapper, BrowserPage):\n@@ -175,8 +172,9 @@ def __init__(self, context, request, ti):\n self.ti = ti\n \n # Set portal_type name on newly created form instance\n- if self.form_instance is not None \\\n- and not getattr(self.form_instance, \'portal_type\', None):\n+ if self.form_instance is not None and not getattr(\n+ self.form_instance, "portal_type", None\n+ ):\n self.form_instance.portal_type = ti.getId()\n \n \ndiff --git a/plone/dexterity/browser/base.py b/plone/dexterity/browser/base.py\nindex c88ae48..581c96d 100644\n--- a/plone/dexterity/browser/base.py\n+++ b/plone/dexterity/browser/base.py\n@@ -7,10 +7,9 @@\n \n \n class DexterityExtensibleForm(AutoExtensibleForm):\n- """Mixin class for Dexterity forms that support updatable fields\n- """\n+ """Mixin class for Dexterity forms that support updatable fields"""\n \n- default_fieldset_label = _(\'label_schema_default\', default=u\'Default\')\n+ default_fieldset_label = _("label_schema_default", default=u"Default")\n \n @property\n def description(self):\n@@ -26,5 +25,4 @@ def schema(self):\n \n @property\n def additionalSchemata(self):\n- return getAdditionalSchemata(context=self.context,\n- portal_type=self.portal_type)\n+ return getAdditionalSchemata(context=self.context, portal_type=self.portal_type)\ndiff --git a/plone/dexterity/browser/edit.py b/plone/dexterity/browser/edit.py\nindex eb55971..e3edcf8 100644\n--- a/plone/dexterity/browser/edit.py\n+++ b/plone/dexterity/browser/edit.py\n@@ -21,36 +21,33 @@ class DefaultEditForm(DexterityExtensibleForm, form.EditForm):\n \n success_message = _(u"Changes saved")\n \n- @button.buttonAndHandler(_(u\'Save\'), name=\'save\')\n+ @button.buttonAndHandler(_(u"Save"), name="save")\n def handleApply(self, action):\n data, errors = self.extractData()\n if errors:\n self.status = self.formErrorsMessage\n return\n self.applyChanges(data)\n- IStatusMessage(self.request).addStatusMessage(\n- self.success_message, "info"\n- )\n+ IStatusMessage(self.request).addStatusMessage(self.success_message, "info")\n self.request.response.redirect(self.nextURL())\n notify(EditFinishedEvent(self.context))\n \n- @button.buttonAndHandler(_(u\'Cancel\'), name=\'cancel\')\n+ @button.buttonAndHandler(_(u"Cancel"), name="cancel")\n def handleCancel(self, action):\n- IStatusMessage(self.request).addStatusMessage(\n- _(u"Edit cancelled"), "info"\n- )\n+ IStatusMessage(self.request).addStatusMessage(_(u"Edit cancelled"), "info")\n self.request.response.redirect(self.nextURL())\n notify(EditCancelledEvent(self.context))\n \n def nextURL(self):\n view_url = self.context.absolute_url()\n- portal_type = getattr(self, \'portal_type\', None)\n+ portal_type = getattr(self, "portal_type", None)\n if portal_type is not None:\n registry = getUtility(IRegistry)\n use_view_action = registry.get(\n- \'plone.types_use_view_action_in_listings\', [])\n+ "plone.types_use_view_action_in_listings", []\n+ )\n if portal_type in use_view_action:\n- view_url = view_url + \'/view\'\n+ view_url = view_url + "/view"\n return view_url\n \n def update(self):\n@@ -64,10 +61,10 @@ def update(self):\n def updateActions(self):\n super(DefaultEditForm, self).updateActions()\n \n- if \'save\' in self.actions:\n+ if "save" in self.actions:\n self.actions["save"].addClass("context")\n \n- if \'cancel\' in self.actions:\n+ if "cancel" in self.actions:\n self.actions["cancel"].addClass("standalone")\n \n @property\n@@ -77,7 +74,8 @@ def fti(self):\n @property\n def label(self):\n type_name = self.fti.Title()\n- return _(u"Edit ${name}", mapping={\'name\': type_name})\n+ return _(u"Edit ${name}", mapping={"name": type_name})\n+\n \n DefaultEditView = layout.wrap_form(DefaultEditForm)\n classImplements(DefaultEditView, IDexterityEditForm)\ndiff --git a/plone/dexterity/browser/fti.py b/plone/dexterity/browser/fti.py\nindex a3844a1..72df006 100644\n--- a/plone/dexterity/browser/fti.py\n+++ b/plone/dexterity/browser/fti.py\n@@ -4,8 +4,7 @@\n \n \n class FTIAddView(FactoryTypeInformationAddView):\n- """Add view for the Dexterity FTI type\n- """\n+ """Add view for the Dexterity FTI type"""\n \n klass = DexterityFTI\n- description = u\'Factory Type Information for Dexterity Content Types\'\n+ description = u"Factory Type Information for Dexterity Content Types"\ndiff --git a/plone/dexterity/browser/traversal.py b/plone/dexterity/browser/traversal.py\nindex 719945a..0487ea5 100644\n--- a/plone/dexterity/browser/traversal.py\n+++ b/plone/dexterity/browser/traversal.py\n@@ -42,29 +42,32 @@ def publishTraverse(self, request, name):\n # If we are trying to traverse to the folder "body" pseudo-object\n # returned by listDAVObjects(), return that immediately\n \n- if getattr(request, \'maybe_webdav_client\', False) \\\n- and name == DAV_FOLDER_DATA_ID:\n- return FolderDataResource(\n- DAV_FOLDER_DATA_ID, context\n- ).__of__(context)\n+ if (\n+ getattr(request, "maybe_webdav_client", False)\n+ and name == DAV_FOLDER_DATA_ID\n+ ):\n+ return FolderDataResource(DAV_FOLDER_DATA_ID, context).__of__(context)\n \n- defaultTraversal = super(\n- DexterityPublishTraverse,\n- self).publishTraverse(request, name)\n+ defaultTraversal = super(DexterityPublishTraverse, self).publishTraverse(\n+ request, name\n+ )\n \n # If this is a WebDAV PUT/PROPFIND/PROPPATCH request, don\'t acquire\n # things. If we did, we couldn\'t create a new object with PUT, for\n # example, because the acquired object would shadow the NullResource\n \n- if getattr(request, \'maybe_webdav_client\', False) \\\n- and request.get(\'REQUEST_METHOD\', \'GET\') not in (\'GET\', \'POST\',) \\\n- and IAcquirer.providedBy(defaultTraversal):\n+ if (\n+ getattr(request, "maybe_webdav_client", False)\n+ and request.get("REQUEST_METHOD", "GET")\n+ not in (\n+ "GET",\n+ "POST",\n+ )\n+ and IAcquirer.providedBy(defaultTraversal)\n+ ):\n parent = aq_parent(aq_inner(defaultTraversal))\n if parent is not None and parent is not context:\n- return NullResource(\n- self.context,\n- name,\n- request).__of__(self.context)\n+ return NullResource(self.context, name, request).__of__(self.context)\n \n return defaultTraversal\n \n@@ -74,8 +77,12 @@ def browserDefault(self, request):\n # default view. The ZPublisher\'s WebDAV implementation doesn\'t\n # deal well with default views.\n \n- if getattr(request, \'maybe_webdav_client\', False) and \\\n- request.get(\'REQUEST_METHOD\', \'GET\') not in (\'GET\', \'POST\',):\n+ if getattr(request, "maybe_webdav_client", False) and request.get(\n+ "REQUEST_METHOD", "GET"\n+ ) not in (\n+ "GET",\n+ "POST",\n+ ):\n return self.context, ()\n \n return super(DexterityPublishTraverse, self).browserDefault(request)\ndiff --git a/plone/dexterity/content.py b/plone/dexterity/content.py\nindex 0bf92de..fa4b656 100644\n--- a/plone/dexterity/content.py\n+++ b/plone/dexterity/content.py\n@@ -61,34 +61,33 @@\n \n # see comment in DexterityContent.__getattr__ method\n ATTRIBUTE_NAMES_TO_IGNORE = (\n- \'_dav_writelocks\',\n- \'aq_inner\',\n- \'getCurrentSkinName\',\n- \'getURL\',\n- \'im_self\', # python 2 only, on python 3 it was renamed to __self__\n- \'plone_utils\',\n- \'portal_membership\',\n- \'portal_placeful_workflow\',\n- \'portal_properties\',\n- \'translation_service\',\n+ "_dav_writelocks",\n+ "aq_inner",\n+ "getCurrentSkinName",\n+ "getURL",\n+ "im_self", # python 2 only, on python 3 it was renamed to __self__\n+ "plone_utils",\n+ "portal_membership",\n+ "portal_placeful_workflow",\n+ "portal_properties",\n+ "translation_service",\n )\n \n-ASSIGNABLE_CACHE_KEY = \'__plone_dexterity_assignable_cache__\'\n+ASSIGNABLE_CACHE_KEY = "__plone_dexterity_assignable_cache__"\n \n \n def _default_from_schema(context, schema, fieldname):\n- """helper to lookup default value of a field\n- """\n+ """helper to lookup default value of a field"""\n if schema is None:\n return _marker\n field = schema.get(fieldname, None)\n if field is None:\n return _marker\n- default_factory = getattr(field, \'defaultFactory\', None)\n+ default_factory = getattr(field, "defaultFactory", None)\n if (\n # check for None to avoid one expensive providedBy (called often)\n- default_factory is not None and\n- IContextAwareDefaultFactory.providedBy(default_factory)\n+ default_factory is not None\n+ and IContextAwareDefaultFactory.providedBy(default_factory)\n ):\n return deepcopy(field.bind(context).default)\n return deepcopy(field.default)\n@@ -104,7 +103,7 @@ def get_assignable(context):\n request = getRequest()\n if not request:\n return IBehaviorAssignable(context, None)\n- cache_key = getattr(context, \'_p_oid\', None)\n+ cache_key = getattr(context, "_p_oid", None)\n if not cache_key:\n return IBehaviorAssignable(context, None)\n assignable_cache = getattr(request, ASSIGNABLE_CACHE_KEY, _marker)\n@@ -131,10 +130,10 @@ def __get__(self, inst, cls=None):\n return getObjectSpecification(cls)\n \n # get direct specification\n- spec = getattr(inst, \'__provides__\', None)\n+ spec = getattr(inst, "__provides__", None)\n \n # avoid recursion - fall back on default\n- if getattr(_recursion_detection, \'blocked\', False):\n+ if getattr(_recursion_detection, "blocked", False):\n return spec\n \n # If the instance doesn\'t have a __provides__ attribute, get the\n@@ -143,7 +142,7 @@ def __get__(self, inst, cls=None):\n spec = implementedBy(cls)\n \n # Find the data we need to know if our cache needs to be invalidated\n- portal_type = getattr(inst, \'portal_type\', None)\n+ portal_type = getattr(inst, "portal_type", None)\n \n # If the instance has no portal type, then we\'re done.\n if portal_type is None:\n@@ -151,7 +150,7 @@ def __get__(self, inst, cls=None):\n \n # Find the cached value. This calculation is expensive and called\n # hundreds of times during each request, so we require a fast cache\n- cache = getattr(inst, \'_v__providedBy__\', None)\n+ cache = getattr(inst, "_v__providedBy__", None)\n \n # See if we have a current cache. Reasons to do this include:\n #\n@@ -162,7 +161,7 @@ def __get__(self, inst, cls=None):\n inst._p_mtime,\n SCHEMA_CACHE.modified(portal_type),\n SCHEMA_CACHE.invalidations,\n- hash(spec)\n+ hash(spec),\n )\n if cache is not None and cache[:-1] == updated:\n if cache[-1] is not None:\n@@ -176,26 +175,24 @@ def __get__(self, inst, cls=None):\n dynamically_provided = []\n \n # block recursion\n- setattr(_recursion_detection, \'blocked\', True)\n+ setattr(_recursion_detection, "blocked", True)\n try:\n assignable = get_assignable(inst)\n if assignable is not None:\n for behavior_registration in assignable.enumerateBehaviors():\n if behavior_registration.marker:\n- dynamically_provided.append(\n- behavior_registration.marker\n- )\n+ dynamically_provided.append(behavior_registration.marker)\n finally:\n- setattr(_recursion_detection, \'blocked\', False)\n+ setattr(_recursion_detection, "blocked", False)\n \n if not dynamically_provided:\n # rare case if no schema nor behaviors with markers are set\n- inst._v__providedBy__ = updated + (None, )\n+ inst._v__providedBy__ = updated + (None,)\n return spec\n \n dynamically_provided.append(spec)\n all_spec = Implements(*dynamically_provided)\n- inst._v__providedBy__ = updated + (all_spec, )\n+ inst._v__providedBy__ = updated + (all_spec,)\n \n return all_spec\n \n@@ -208,7 +205,7 @@ class AttributeValidator(Explicit):\n \n def __call__(self, name, value):\n # Short circuit for things like views or viewlets\n- if name == \'\':\n+ if name == "":\n return 1\n \n context = aq_parent(self)\n@@ -218,8 +215,7 @@ def __call__(self, name, value):\n # decides to have behaviors bound on something different than context\n # or fti, i.e. schemas for subtrees.\n protection_dict = all_merged_tagged_values_dict(\n- iterSchemata(context),\n- READ_PERMISSIONS_KEY\n+ iterSchemata(context), READ_PERMISSIONS_KEY\n )\n \n if name not in protection_dict:\n@@ -227,15 +223,12 @@ def __call__(self, name, value):\n \n permission = queryUtility(IPermission, name=protection_dict[name])\n if permission is not None:\n- return getSecurityManager().checkPermission(\n- permission.title, context\n- )\n+ return getSecurityManager().checkPermission(permission.title, context)\n \n return 0\n \n \n class PasteBehaviourMixin(object):\n-\n def _notifyOfCopyTo(self, container, op=0):\n """Keep Archetypes\' reference info internally when op == 1 (move)\n because in those cases we need to keep Archetypes\' refeferences.\n@@ -274,13 +267,11 @@ def _verifyObjectPaste(self, obj, validate_src=True):\n # allowed.\n super(PasteBehaviourMixin, self)._verifyObjectPaste(obj, validate_src)\n if validate_src:\n- portal_type = getattr(aq_base(obj), \'portal_type\', None)\n+ portal_type = getattr(aq_base(obj), "portal_type", None)\n if portal_type:\n fti = queryUtility(ITypeInformation, name=portal_type)\n if fti is not None and not fti.isConstructionAllowed(self):\n- raise ValueError(\n- \'You can not add the copied content here.\'\n- )\n+ raise ValueError("You can not add the copied content here.")\n \n def _getCopy(self, container):\n # Copy the _v_is_cp and _v_cp_refs flags from the original\n@@ -289,13 +280,13 @@ def _getCopy(self, container):\n # When the flags are missing, an Archetypes child object will not have\n # the UID updated in some situations.\n # Copied from Products.Archetypes.Referenceable.Referenceable._getCopy\n- is_cp_flag = getattr(self, \'_v_is_cp\', None)\n- cp_refs_flag = getattr(self, \'_v_cp_refs\', None)\n+ is_cp_flag = getattr(self, "_v_is_cp", None)\n+ cp_refs_flag = getattr(self, "_v_cp_refs", None)\n ob = super(PasteBehaviourMixin, self)._getCopy(container)\n if is_cp_flag:\n- setattr(ob, \'_v_is_cp\', is_cp_flag)\n+ setattr(ob, "_v_is_cp", is_cp_flag)\n if cp_refs_flag:\n- setattr(ob, \'_v_cp_refs\', cp_refs_flag)\n+ setattr(ob, "_v_cp_refs", cp_refs_flag)\n return ob\n \n \n@@ -305,12 +296,10 @@ def _getCopy(self, container):\n IAttributeUUID,\n IDublinCore,\n ICatalogableDublinCore,\n- IMutableDublinCore\n+ IMutableDublinCore,\n )\n-class DexterityContent(DAVResourceMixin, PortalContent, PropertyManager,\n- Contained):\n- """Base class for Dexterity content\n- """\n+class DexterityContent(DAVResourceMixin, PortalContent, PropertyManager, Contained):\n+ """Base class for Dexterity content"""\n \n __providedBy__ = FTIAwareSpecification()\n __allow_access_to_unprotected_subobjects__ = AttributeValidator()\n@@ -320,23 +309,31 @@ class DexterityContent(DAVResourceMixin, PortalContent, PropertyManager,\n # portal_type is set by the add view and/or factory\n portal_type = None\n \n- title = u\'\'\n- description = u\'\'\n+ title = u""\n+ description = u""\n subject = ()\n creators = ()\n contributors = ()\n effective_date = None\n expiration_date = None\n- format = \'text/html\'\n- language = \'\'\n- rights = \'\'\n+ format = "text/html"\n+ language = ""\n+ rights = ""\n \n def __init__(\n- self,\n- id=None, title=_marker, subject=_marker, description=_marker,\n- contributors=_marker, effective_date=_marker,\n- expiration_date=_marker, format=_marker, language=_marker,\n- rights=_marker, **kwargs):\n+ self,\n+ id=None,\n+ title=_marker,\n+ subject=_marker,\n+ description=_marker,\n+ contributors=_marker,\n+ effective_date=_marker,\n+ expiration_date=_marker,\n+ format=_marker,\n+ language=_marker,\n+ rights=_marker,\n+ **kwargs\n+ ):\n \n if id is not None:\n self.id = id\n@@ -378,20 +375,16 @@ def __getattr__(self, name):\n # Ignore also some other well known names like\n # Permission, Acquisition and AccessControl related ones.\n if (\n- name.startswith(\'__\')\n- or name.startswith(\'_v\')\n- or name.endswith(\'_Permission\')\n+ name.startswith("__")\n+ or name.startswith("_v")\n+ or name.endswith("_Permission")\n or name in ATTRIBUTE_NAMES_TO_IGNORE\n ):\n raise AttributeError(name)\n \n # attribute was not found; try to look it up in the schema and return\n # a default\n- value = _default_from_schema(\n- self,\n- SCHEMA_CACHE.get(self.portal_type),\n- name\n- )\n+ value = _default_from_schema(self, SCHEMA_CACHE.get(self.portal_type), name)\n if value is not _marker:\n return value\n \n@@ -401,9 +394,7 @@ def __getattr__(self, name):\n for behavior_registration in assignable.enumerateBehaviors():\n if behavior_registration.interface:\n value = _default_from_schema(\n- self,\n- behavior_registration.interface,\n- name\n+ self, behavior_registration.interface, name\n )\n if value is not _marker:\n return value\n@@ -451,7 +442,7 @@ def addCreator(self, creator=None):\n \n # call self.listCreators() to make sure self.creators exists\n if creator and creator not in self.listCreators():\n- self.creators = self.creators + (creator, )\n+ self.creators = self.creators + (creator,)\n \n @security.protected(permissions.ModifyPortalContent)\n def setModificationDate(self, modification_date=None):\n@@ -468,29 +459,29 @@ def setModificationDate(self, modification_date=None):\n def Title(self):\n # this is a CMF accessor, so should return utf8-encoded\n if six.PY2 and isinstance(self.title, six.text_type):\n- return self.title.encode(\'utf-8\')\n- return self.title or \'\'\n+ return self.title.encode("utf-8")\n+ return self.title or ""\n \n @security.protected(permissions.View)\n def Description(self):\n- value = self.description or \'\'\n+ value = self.description or ""\n \n # If description is containing linefeeds the HTML\n # validation can break.\n # See http://bo.geekworld.dk/diazo-bug-on-html5-validation-errors/\n # Remember: \\r\\n - Windows, \\r - OS X, \\n - Linux/Unix\n- value = value.replace(\'\\r\\n\', \' \').replace(\'\\r\', \' \').replace(\'\\n\', \' \') # noqa\n+ value = value.replace("\\r\\n", " ").replace("\\r", " ").replace("\\n", " ") # noqa\n \n # this is a CMF accessor, so should return utf8-encoded\n if six.PY2 and isinstance(value, six.text_type):\n- value = value.encode(\'utf-8\')\n+ value = value.encode("utf-8")\n \n return value\n \n @security.protected(permissions.View)\n def Type(self):\n ti = self.getTypeInfo()\n- return ti is not None and ti.Title() or \'Unknown\'\n+ return ti is not None and ti.Title() or "Unknown"\n \n # IDublinCore\n \n@@ -507,7 +498,7 @@ def listCreators(self):\n def Creator(self):\n # Dublin Core Creator element - resource author.\n creators = self.listCreators()\n- return creators and creators[0] or \'\'\n+ return creators and creators[0] or ""\n \n @security.protected(permissions.View)\n def Subject(self):\n@@ -521,7 +512,7 @@ def Subject(self):\n @security.protected(permissions.View)\n def Publisher(self):\n # Dublin Core Publisher element - resource publisher.\n- return \'No publisher\'\n+ return "No publisher"\n \n @security.protected(permissions.View)\n def listContributors(self):\n@@ -541,7 +532,7 @@ def Date(self, zone=None):\n if zone is None:\n zone = _zone\n # Return effective_date if set, modification date otherwise\n- date = getattr(self, \'effective_date\', None)\n+ date = getattr(self, "effective_date", None)\n if date is None:\n date = self.modified()\n \n@@ -558,25 +549,25 @@ def CreationDate(self, zone=None):\n date = datify(self.creation_date)\n return date.toZone(zone).ISO()\n else:\n- return \'Unknown\'\n+ return "Unknown"\n \n @security.protected(permissions.View)\n def EffectiveDate(self, zone=None):\n # Dublin Core Date element - date resource becomes effective.\n if zone is None:\n zone = _zone\n- ed = getattr(self, \'effective_date\', None)\n+ ed = getattr(self, "effective_date", None)\n ed = datify(ed)\n- return ed and ed.toZone(zone).ISO() or \'None\'\n+ return ed and ed.toZone(zone).ISO() or "None"\n \n @security.protected(permissions.View)\n def ExpirationDate(self, zone=None):\n # Dublin Core Date element - date resource expires.\n if zone is None:\n zone = _zone\n- ed = getattr(self, \'expiration_date\', None)\n+ ed = getattr(self, "expiration_date", None)\n ed = datify(ed)\n- return ed and ed.toZone(zone).ISO() or \'None\'\n+ return ed and ed.toZone(zone).ISO() or "None"\n \n @security.protected(permissions.View)\n def ModificationDate(self, zone=None):\n@@ -609,23 +600,23 @@ def Rights(self):\n def created(self):\n # Dublin Core Date element - date resource created.\n # allow for non-existent creation_date, existed always\n- date = getattr(self, \'creation_date\', None)\n+ date = getattr(self, "creation_date", None)\n date = datify(date)\n return date is None and FLOOR_DATE or date\n \n @security.protected(permissions.View)\n def effective(self):\n # Dublin Core Date element - date resource becomes effective.\n- date = getattr(self, \'effective_date\', _marker)\n+ date = getattr(self, "effective_date", _marker)\n if date is _marker:\n- date = getattr(self, \'creation_date\', None)\n+ date = getattr(self, "creation_date", None)\n date = datify(date)\n return date is None and FLOOR_DATE or date\n \n @security.protected(permissions.View)\n def expires(self):\n # Dublin Core Date element - date resource expires.\n- date = getattr(self, \'expiration_date\', None)\n+ date = getattr(self, "expiration_date", None)\n date = datify(date)\n return date is None and CEILING_DATE or date\n \n@@ -643,10 +634,8 @@ def modified(self):\n @security.protected(permissions.View)\n def isEffective(self, date):\n # Is the date within the resource\'s effective range?\n- pastEffective = (\n- self.effective_date is None or self.effective_date <= date)\n- beforeExpiration = (\n- self.expiration_date is None or self.expiration_date >= date)\n+ pastEffective = self.effective_date is None or self.effective_date <= date\n+ beforeExpiration = self.expiration_date is None or self.expiration_date >= date\n return pastEffective and beforeExpiration\n \n # IMutableDublinCore\n@@ -679,9 +668,8 @@ def setSubject(self, subject):\n def setContributors(self, contributors):\n # Set Dublin Core Contributor elements - resource collaborators.\n if isinstance(contributors, six.string_types):\n- contributors = contributors.split(\';\')\n- self.contributors = tuple(\n- safe_unicode(c.strip()) for c in contributors)\n+ contributors = contributors.split(";")\n+ self.contributors = tuple(safe_unicode(c.strip()) for c in contributors)\n \n @security.protected(permissions.ModifyPortalContent)\n def setEffectiveDate(self, effective_date):\n@@ -711,18 +699,24 @@ def setRights(self, rights):\n \n @implementer(IDexterityItem)\n class Item(PasteBehaviourMixin, BrowserDefaultMixin, DexterityContent):\n- """A non-containerish, CMFish item\n- """\n+ """A non-containerish, CMFish item"""\n \n __providedBy__ = FTIAwareSpecification()\n __allow_access_to_unprotected_subobjects__ = AttributeValidator()\n \n isPrincipiaFolderish = 0\n \n- manage_options = PropertyManager.manage_options + ({\n- \'label\': \'View\',\n- \'action\': \'view\',\n- },) + CMFCatalogAware.manage_options + SimpleItem.manage_options\n+ manage_options = (\n+ PropertyManager.manage_options\n+ + (\n+ {\n+ "label": "View",\n+ "action": "view",\n+ },\n+ )\n+ + CMFCatalogAware.manage_options\n+ + SimpleItem.manage_options\n+ )\n \n # Be explicit about which __getattr__ to use\n __getattr__ = DexterityContent.__getattr__\n@@ -730,26 +724,25 @@ class Item(PasteBehaviourMixin, BrowserDefaultMixin, DexterityContent):\n \n @implementer(IDexterityContainer)\n class Container(\n- PathReprProvider,\n- PasteBehaviourMixin, DAVCollectionMixin, BrowserDefaultMixin,\n- CMFCatalogAware, CMFOrderedBTreeFolderBase, DexterityContent):\n- """Base class for folderish items\n- """\n+ PathReprProvider,\n+ PasteBehaviourMixin,\n+ DAVCollectionMixin,\n+ BrowserDefaultMixin,\n+ CMFCatalogAware,\n+ CMFOrderedBTreeFolderBase,\n+ DexterityContent,\n+):\n+ """Base class for folderish items"""\n \n __providedBy__ = FTIAwareSpecification()\n __allow_access_to_unprotected_subobjects__ = AttributeValidator()\n \n security = ClassSecurityInfo()\n- security.declareProtected(\n- acpermissions.copy_or_move, \'manage_copyObjects\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_cutObjects\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_pasteObjects\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_renameObject\')\n- security.declareProtected(\n- permissions.ModifyPortalContent, \'manage_renameObjects\')\n+ security.declareProtected(acpermissions.copy_or_move, "manage_copyObjects")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_cutObjects")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_pasteObjects")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_renameObject")\n+ security.declareProtected(permissions.ModifyPortalContent, "manage_renameObjects")\n \n isPrincipiaFolderish = 1\n \n@@ -789,12 +782,9 @@ def manage_delObjects(self, ids=None, REQUEST=None):\n for id in ids:\n item = self._getOb(id)\n if not getSecurityManager().checkPermission(\n- permissions.DeleteObjects,\n- item\n+ permissions.DeleteObjects, item\n ):\n- raise Unauthorized(\n- "Do not have permissions to remove this object"\n- )\n+ raise Unauthorized("Do not have permissions to remove this object")\n return super(Container, self).manage_delObjects(ids, REQUEST=REQUEST)\n \n # override PortalFolder\'s allowedContentTypes to respect IConstrainTypes\n@@ -820,12 +810,12 @@ def invokeFactory(self, type_name, id, RESPONSE=None, *args, **kw):\n # an Unauthorized over a ValueError.\n fti = queryUtility(ITypeInformation, name=type_name)\n if fti is not None and not fti.isConstructionAllowed(self):\n- raise Unauthorized(\'Cannot create %s\' % fti.getId())\n+ raise Unauthorized("Cannot create %s" % fti.getId())\n \n allowed_ids = [i.getId() for i in constrains.allowedContentTypes()]\n if type_name not in allowed_ids:\n raise ValueError(\n- \'Subobject type disallowed by IConstrainTypes adapter: %s\'\n+ "Subobject type disallowed by IConstrainTypes adapter: %s"\n % type_name\n )\n \n@@ -835,8 +825,7 @@ def invokeFactory(self, type_name, id, RESPONSE=None, *args, **kw):\n \n \n def reindexOnModify(content, event):\n- """When an object is modified, re-index it in the catalog\n- """\n+ """When an object is modified, re-index it in the catalog"""\n \n if event.object is not content:\n return\ndiff --git a/plone/dexterity/events.py b/plone/dexterity/events.py\nindex 4bee910..81e08bd 100644\n--- a/plone/dexterity/events.py\n+++ b/plone/dexterity/events.py\n@@ -1,13 +1,12 @@\n # -*- coding: utf-8 -*-\n from plone.dexterity import interfaces\n-from zope.interface.interfaces import ObjectEvent\n from zope.interface import implementer\n+from zope.interface.interfaces import ObjectEvent\n \n \n @implementer(interfaces.IEditBegunEvent)\n class EditBegunEvent(ObjectEvent):\n- """An edit operation was begun\n- """\n+ """An edit operation was begun"""\n \n \n @implementer(interfaces.IAddBegunEvent)\n@@ -19,8 +18,7 @@ class AddBegunEvent(ObjectEvent):\n \n @implementer(interfaces.IEditCancelledEvent)\n class EditCancelledEvent(ObjectEvent):\n- """An edit operation was cancelled\n- """\n+ """An edit operation was cancelled"""\n \n \n @implementer(interfaces.IAddCancelledEvent)\ndiff --git a/plone/dexterity/exportimport.py b/plone/dexterity/exportimport.py\nindex 591f825..ee39472 100644\n--- a/plone/dexterity/exportimport.py\n+++ b/plone/dexterity/exportimport.py\n@@ -19,7 +19,7 @@\n \n @implementer(IFilesystemExporter, IFilesystemImporter)\n class DexterityContentExporterImporter(FolderishExporterImporter):\n- """ Tree-walking exporter / importer for Dexterity types.\n+ """Tree-walking exporter / importer for Dexterity types.\n \n This is based on the generic one in GenericSetup,\n but it uses Dexterity\'s rfc822 serialization support\n@@ -43,12 +43,11 @@ def __init__(self, context):\n self.context = context\n \n def export(self, export_context, subdir, root=False):\n- """ See IFilesystemExporter.\n- """\n+ """See IFilesystemExporter."""\n context = self.context\n \n if not root:\n- subdir = \'%s/%s\' % (subdir, context.getId())\n+ subdir = "%s/%s" % (subdir, context.getId())\n \n exportable = self.listExportableItems()\n \n@@ -66,19 +65,19 @@ def export(self, export_context, subdir, root=False):\n csv_writer.writerow((object_id, factory_name))\n \n export_context.writeDataFile(\n- \'.objects\',\n+ ".objects",\n text=stream.getvalue(),\n- content_type=\'text/comma-separated-values\',\n+ content_type="text/comma-separated-values",\n subdir=subdir,\n )\n \n props = context.manage_FTPget()\n- if hasattr(props, \'read\'):\n+ if hasattr(props, "read"):\n props = props.read()\n export_context.writeDataFile(\n- \'.data\',\n+ ".data",\n text=props,\n- content_type=\'text/plain\',\n+ content_type="text/plain",\n subdir=subdir,\n )\n \n@@ -87,19 +86,18 @@ def export(self, export_context, subdir, root=False):\n adapter.export(export_context, subdir)\n \n def import_(self, import_context, subdir, root=False):\n- """ See IFilesystemImporter.\n- """\n+ """See IFilesystemImporter."""\n context = self.context\n if not root:\n- subdir = \'%s/%s\' % (subdir, context.getId())\n+ subdir = "%s/%s" % (subdir, context.getId())\n \n- data = import_context.readDataFile(\'.data\', subdir)\n+ data = import_context.readDataFile(".data", subdir)\n if data is not None:\n request = FauxDAVRequest(BODY=data, BODYFILE=BytesIO(data))\n response = FauxDAVResponse()\n context.PUT(request, response)\n \n- preserve = import_context.readDataFile(\'.preserve\', subdir)\n+ preserve = import_context.readDataFile(".preserve", subdir)\n must_preserve = self._mustPreserve()\n \n prior = context.objectIds()\n@@ -109,7 +107,7 @@ def import_(self, import_context, subdir, root=False):\n else:\n # Make sure ``preserve`` is a native string\n if six.PY3 and not isinstance(preserve, str):\n- preserve = preserve.decode(\'utf-8\')\n+ preserve = preserve.decode("utf-8")\n preserve = _globtest(preserve, prior)\n \n preserve.extend([x[0] for x in must_preserve])\n@@ -118,13 +116,13 @@ def import_(self, import_context, subdir, root=False):\n if id not in preserve:\n context._delObject(id)\n \n- objects = import_context.readDataFile(\'.objects\', subdir)\n+ objects = import_context.readDataFile(".objects", subdir)\n if objects is None:\n return\n \n- dialect = \'excel\'\n+ dialect = "excel"\n if six.PY3 and not isinstance(objects, str):\n- objects = objects.decode(\'utf-8\')\n+ objects = objects.decode("utf-8")\n stream = StringIO(objects)\n \n rowiter = reader(stream, dialect)\n@@ -135,12 +133,14 @@ def import_(self, import_context, subdir, root=False):\n for object_id, type_name in rows:\n \n if object_id not in existing:\n- object = self._makeInstance(object_id, type_name,\n- subdir, import_context)\n+ object = self._makeInstance(\n+ object_id, type_name, subdir, import_context\n+ )\n if object is None:\n- logger = import_context.getLogger(\'SFWA\')\n- logger.warning("Couldn\'t make instance: %s/%s" %\n- (subdir, object_id))\n+ logger = import_context.getLogger("SFWA")\n+ logger.warning(\n+ "Couldn\'t make instance: %s/%s" % (subdir, object_id)\n+ )\n continue\n \n wrapped = context._getOb(object_id)\ndiff --git a/plone/dexterity/factory.py b/plone/dexterity/factory.py\nindex 56be581..8f0eef5 100644\n--- a/plone/dexterity/factory.py\n+++ b/plone/dexterity/factory.py\n@@ -11,8 +11,7 @@\n \n @implementer(IDexterityFactory)\n class DexterityFactory(Persistent, Factory):\n- """A factory for Dexterity content.\n- """\n+ """A factory for Dexterity content."""\n \n def __init__(self, portal_type):\n self.portal_type = portal_type\n@@ -33,8 +32,8 @@ def __call__(self, *args, **kw):\n klass = resolveDottedName(fti.klass)\n if klass is None or not callable(klass):\n raise ValueError(\n- "Content class %s set for type %s is not valid" %\n- (fti.klass, self.portal_type)\n+ "Content class %s set for type %s is not valid"\n+ % (fti.klass, self.portal_type)\n )\n \n try:\n@@ -47,7 +46,7 @@ def __call__(self, *args, **kw):\n \n # Set portal_type if not set, but avoid creating an instance variable\n # if possible\n- if getattr(obj, \'portal_type\', \'\') != self.portal_type:\n+ if getattr(obj, "portal_type", "") != self.portal_type:\n obj.portal_type = self.portal_type\n \n return obj\n@@ -59,4 +58,4 @@ def getInterfaces(self):\n return spec\n \n def __repr__(self):\n- return \'<%s for %s>\' % (self.__class__.__name__, self.portal_type)\n+ return "<%s for %s>" % (self.__class__.__name__, self.portal_type)\ndiff --git a/plone/dexterity/filerepresentation.py b/plone/dexterity/filerepresentation.py\nindex c0ed037..58a0d84 100644\n--- a/plone/dexterity/filerepresentation.py\n+++ b/plone/dexterity/filerepresentation.py\n@@ -71,7 +71,7 @@ def get_size(self):\n if sized is None:\n return 0\n unit, size = sized.sizeForSorting()\n- if unit in (\'byte\', \'bytes\'):\n+ if unit in ("byte", "bytes"):\n return size\n return 0\n \n@@ -87,7 +87,7 @@ def getSize(self):\n adapter = schema(self)\n for name, field in getFieldsInOrder(schema):\n value = getattr(adapter, name, None)\n- if hasattr(value, \'getSize\'):\n+ if hasattr(value, "getSize"):\n size += value.getSize()\n return size\n \n@@ -106,8 +106,7 @@ def Format(self):\n \n @security.protected(permissions.View)\n def manage_DAVget(self):\n- """Get the body of the content item in a WebDAV response.\n- """\n+ """Get the body of the content item in a WebDAV response."""\n return self.manage_FTPget()\n \n @security.protected(permissions.View)\n@@ -119,7 +118,7 @@ def manage_FTPget(self, REQUEST=None, RESPONSE=None):\n """\n reader = IRawReadFile(self, None)\n if reader is None:\n- return \'\'\n+ return ""\n \n request = REQUEST is not None and REQUEST or self.REQUEST\n response = RESPONSE is not None and RESPONSE or request.response\n@@ -130,14 +129,19 @@ def manage_FTPget(self, REQUEST=None, RESPONSE=None):\n if mimeType is not None:\n if encoding is not None:\n response.setHeader(\n- \'Content-Type\', \'%s; charset="%s"\' % (mimeType, encoding,)\n+ "Content-Type",\n+ \'%s; charset="%s"\'\n+ % (\n+ mimeType,\n+ encoding,\n+ ),\n )\n else:\n- response.setHeader(\'Content-Type\', mimeType)\n+ response.setHeader("Content-Type", mimeType)\n \n size = reader.size()\n if size is not None:\n- response.setHeader(\'Content-Length\', str(size))\n+ response.setHeader("Content-Length", str(size))\n \n # if the reader is an iterator that the publisher can handle, return\n # it as-is. Otherwise, read the full contents\n@@ -163,7 +167,7 @@ def PUT(self, REQUEST=None, RESPONSE=None):\n self.dav__init(request, response)\n self.dav__simpleifhandler(request, response, refresh=1)\n \n- infile = request.get(\'BODYFILE\', None)\n+ infile = request.get("BODYFILE", None)\n if infile is None:\n raise MethodNotAllowed(\n "Cannot complete PUT request: No BODYFILE in request"\n@@ -175,17 +179,17 @@ def PUT(self, REQUEST=None, RESPONSE=None):\n "Cannot complete PUT request: No IRawWriteFile adapter found"\n )\n \n- contentTypeHeader = request.get_header(\'content-type\', None)\n+ contentTypeHeader = request.get_header("content-type", None)\n \n if contentTypeHeader is not None:\n msg = Message()\n- msg[\'Content-Type\'] = contentTypeHeader\n+ msg["Content-Type"] = contentTypeHeader\n \n mimeType = msg.get_content_type()\n if mimeType is not None:\n writer.mimeType = mimeType\n \n- charset = msg.get_param(\'charset\')\n+ charset = msg.get_param("charset")\n if charset is not None:\n writer.encoding = charset\n \n@@ -266,7 +270,7 @@ class FolderDataResource(Implicit, Resource):\n security = ClassSecurityInfo()\n \n def __init__(self, name, parent):\n- self.__dict__.update({\'__parent__\': parent, \'__name__\': name})\n+ self.__dict__.update({"__parent__": parent, "__name__": name})\n \n # We need to proxy certain things to the parent for getting and setting\n # of property sheet values to work.\n@@ -316,14 +320,12 @@ def HEAD(self, REQUEST, RESPONSE):\n \n @security.protected(permissions.ListFolderContents)\n def OPTIONS(self, REQUEST, RESPONSE):\n- """OPTIONS request: delegate to parent\n- """\n+ """OPTIONS request: delegate to parent"""\n return self.__parent__.OPTIONS(REQUEST, RESPONSE)\n \n @security.protected(permissions.View)\n def TRACE(self, REQUEST, RESPONSE):\n- """TRACE request: delegate to parent\n- """\n+ """TRACE request: delegate to parent"""\n return self.__parent__.TRACE(REQUEST, RESPONSE)\n \n @security.protected(permissions.View)\n@@ -346,78 +348,61 @@ def PROPPATCH(self, REQUEST, RESPONSE):\n \n @security.protected(permissions.ModifyPortalContent)\n def LOCK(self, REQUEST, RESPONSE):\n- """LOCK request: delegate to parent\n- """\n+ """LOCK request: delegate to parent"""\n return self.__parent__.LOCK(REQUEST, RESPONSE)\n \n @security.protected(permissions.ModifyPortalContent)\n def UNLOCK(self, REQUEST, RESPONSE):\n- """UNLOCK request: delegate to parent\n- """\n+ """UNLOCK request: delegate to parent"""\n return self.__parent__.UNLOCK(REQUEST, RESPONSE)\n \n @security.protected(permissions.ModifyPortalContent)\n def PUT(self, REQUEST, RESPONSE):\n- """PUT request: delegate to parent\n- """\n+ """PUT request: delegate to parent"""\n return self.__parent__.PUT(REQUEST, RESPONSE)\n \n @security.protected(permissions.AddPortalContent)\n def MKCOL(self, REQUEST, RESPONSE):\n- """MKCOL request: not allowed\n- """\n+ """MKCOL request: not allowed"""\n raise MethodNotAllowed(\n- \'Cannot create a collection inside a folder data: try at the \'\n- \'folder level instead\'\n+ "Cannot create a collection inside a folder data: try at the "\n+ "folder level instead"\n )\n \n @security.protected(permissions.DeleteObjects)\n def DELETE(self, REQUEST, RESPONSE):\n- """DELETE request: not allowed\n- """\n- raise MethodNotAllowed(\n- \'Cannot delete folder data: delete folder instead\'\n- )\n+ """DELETE request: not allowed"""\n+ raise MethodNotAllowed("Cannot delete folder data: delete folder instead")\n \n @security.protected(permissions.AddPortalContent)\n def COPY(self, REQUEST, RESPONSE):\n- """COPY request: not allowed\n- """\n- raise MethodNotAllowed(\n- \'Cannot copy folder data: copy the folder instead\'\n- )\n+ """COPY request: not allowed"""\n+ raise MethodNotAllowed("Cannot copy folder data: copy the folder instead")\n \n @security.protected(permissions.AddPortalContent)\n def MOVE(self, REQUEST, RESPONSE):\n- """MOVE request: not allowed\n- """\n- raise MethodNotAllowed(\n- \'Cannot move folder data: move the folder instead\'\n- )\n+ """MOVE request: not allowed"""\n+ raise MethodNotAllowed("Cannot move folder data: move the folder instead")\n \n @security.protected(permissions.View)\n def manage_DAVget(self):\n- """DAV content access: delete to manage_FTPget()\n- """\n+ """DAV content access: delete to manage_FTPget()"""\n return self.__parent__.manage_DAVget()\n \n @security.protected(permissions.View)\n def manage_FTPget(self):\n- """FTP access: delegate to parent\n- """\n+ """FTP access: delegate to parent"""\n return self.__parent__.manage_FTPget()\n \n @security.protected(permissions.ListFolderContents)\n def listDAVObjects(self):\n- """DAV object listing: return nothing\n- """\n+ """DAV object listing: return nothing"""\n return []\n \n \n @implementer(IStreamIterator)\n class StringStreamIterator(object):\n- """Simple stream iterator to allow efficient data streaming.\n- """\n+ """Simple stream iterator to allow efficient data streaming."""\n \n def __init__(self, data, size=None, chunk=1 << 16):\n """Consume data (a str) into a temporary file and prepare streaming.\n@@ -427,11 +412,11 @@ def __init__(self, data, size=None, chunk=1 << 16):\n \n chunk is the chunk size for the iterator\n """\n- f = tempfile.TemporaryFile(mode=\'w+b\')\n+ f = tempfile.TemporaryFile(mode="w+b")\n f.write(data)\n \n if size is not None:\n- assert size == f.tell(), \'Size argument does not match data length\'\n+ assert size == f.tell(), "Size argument does not match data length"\n else:\n size = f.tell()\n \n@@ -488,12 +473,12 @@ def __init__(self, context):\n def __call__(self, name, contentType, data):\n \n # Deal with Finder cruft\n- if name == \'.DS_Store\':\n+ if name == ".DS_Store":\n raise Unauthorized("Refusing to store Mac OS X resource forks")\n- elif name.startswith(\'._\'):\n+ elif name.startswith("._"):\n raise Unauthorized("Refusing to store Mac OS X resource forks")\n \n- registry = getToolByName(self.context, \'content_type_registry\', None)\n+ registry = getToolByName(self.context, "content_type_registry", None)\n if registry is None:\n return None # fall back on default\n \n@@ -501,7 +486,7 @@ def __call__(self, name, contentType, data):\n if typeObjectName is None:\n return # fall back on default\n \n- typesTool = getToolByName(self.context, \'portal_types\')\n+ typesTool = getToolByName(self.context, "portal_types")\n \n targetType = typesTool.getTypeInfo(typeObjectName)\n if targetType is None:\n@@ -529,19 +514,17 @@ def __call__(self, name, contentType, data):\n if contextType is not None:\n if not contextType.allowType(typeObjectName):\n raise Unauthorized(\n- "Creating a %s object here is not allowed" %\n- typeObjectName\n+ "Creating a %s object here is not allowed" % typeObjectName\n )\n \n if not targetType.isConstructionAllowed(self.context):\n raise Unauthorized(\n- "Creating a %s object here is not allowed" %\n- typeObjectName\n+ "Creating a %s object here is not allowed" % typeObjectName\n )\n \n obj = createObject(targetType.factory, name)\n \n- if hasattr(obj, \'_setPortalTypeName\'):\n+ if hasattr(obj, "_setPortalTypeName"):\n obj._setPortalTypeName(targetType.getId())\n \n # we fire this event here, because NullResource.PUT will now go\n@@ -569,7 +552,7 @@ def __init__(self, context):\n self._size = 0\n \n mimeType = None\n- encoding = \'utf-8\'\n+ encoding = "utf-8"\n name = None\n \n @property\n@@ -649,19 +632,19 @@ def mimeType(self):\n if IPrimaryField.providedBy(field):\n if foundOne:\n # more than one primary field\n- return \'message/rfc822\'\n+ return "message/rfc822"\n else:\n foundOne = True\n # zero or one primary fields\n- return \'text/plain\'\n+ return "text/plain"\n if not self._getMessage().is_multipart():\n- return \'text/plain\'\n+ return "text/plain"\n else:\n- return \'message/rfc822\'\n+ return "message/rfc822"\n \n @property\n def encoding(self):\n- return self._getMessage().get_charset() or \'utf-8\'\n+ return self._getMessage().get_charset() or "utf-8"\n \n @property\n def name(self):\n@@ -679,13 +662,10 @@ def size(self):\n @memoize\n def _getMessage(self):\n # Construct message on demand.\n- message = constructMessageFromSchemata(\n- self.context,\n- iterSchemata(self.context)\n- )\n+ message = constructMessageFromSchemata(self.context, iterSchemata(self.context))\n \n # Store the portal type in a header, to allow it to be identifed later\n- message[\'Portal-Type\'] = self.context.portal_type\n+ message["Portal-Type"] = self.context.portal_type\n \n return message\n \n@@ -697,18 +677,17 @@ def _getStream(self):\n # publisher, which will serve it efficiently even after the\n # transaction is closed\n message = self._getMessage()\n- out = tempfile.TemporaryFile(mode=\'w+b\')\n+ out = tempfile.TemporaryFile(mode="w+b")\n if six.PY2:\n out.write(message.as_string())\n else:\n- out.write(message.as_string().encode(\'utf-8\'))\n+ out.write(message.as_string().encode("utf-8"))\n self._size = out.tell()\n out.seek(0)\n return out\n \n def __next__(self):\n- """ Iterate over the stream\n- """\n+ """Iterate over the stream"""\n return self._getStream().__next__()\n \n \n@@ -727,7 +706,7 @@ def __init__(self, context):\n self._written = 0\n \n mimeType = None\n- encoding = \'utf-8\'\n+ encoding = "utf-8"\n name = None\n \n @property\n@@ -785,7 +764,7 @@ def __init__(self, context):\n self.context = context\n \n self._mimeType = None\n- self._encoding = \'utf-8\'\n+ self._encoding = "utf-8"\n self._closed = False\n self._name = None\n self._written = 0\n@@ -797,9 +776,9 @@ def mimeType(self):\n if self._message is None:\n return self._mimeType\n elif not self._message.is_multipart():\n- return \'text/plain\'\n+ return "text/plain"\n else:\n- return \'message/rfc822\'\n+ return "message/rfc822"\n \n @mimeType.setter\n def mimeType(self, value):\n@@ -839,10 +818,7 @@ def close(self):\n self._message = self._parser.close()\n self._closed = True\n initializeObjectFromSchemata(\n- self.context,\n- iterSchemata(self.context),\n- self._message,\n- self._encoding\n+ self.context, iterSchemata(self.context), self._message, self._encoding\n )\n \n def write(self, data):\ndiff --git a/plone/dexterity/fti.py b/plone/dexterity/fti.py\nindex 05f1b87..8ae810c 100644\n--- a/plone/dexterity/fti.py\n+++ b/plone/dexterity/fti.py\n@@ -32,7 +32,6 @@\n \n @implementer(IDexterityFTIModificationDescription)\n class DexterityFTIModificationDescription(object):\n-\n def __init__(self, attribute, oldValue):\n self.attribute = attribute\n self.oldValue = oldValue\n@@ -40,105 +39,102 @@ def __init__(self, attribute, oldValue):\n \n @implementer(IDexterityFTI)\n class DexterityFTI(base.DynamicViewTypeInformation):\n- """A Dexterity FTI\n- """\n+ """A Dexterity FTI"""\n \n meta_type = "Dexterity FTI"\n \n- behaviors_type = \'ulines\'\n+ behaviors_type = "ulines"\n if six.PY2:\n- behaviors_type = \'lines\'\n+ behaviors_type = "lines"\n \n _properties = base.DynamicViewTypeInformation._properties + (\n {\n- \'id\': \'add_permission\',\n- \'type\': \'selection\',\n- \'select_variable\': \'possiblePermissionIds\',\n- \'mode\': \'w\',\n- \'label\': \'Add permission\',\n- \'description\': \'Permission needed to be able to add content of \'\n- \'this type\',\n+ "id": "add_permission",\n+ "type": "selection",\n+ "select_variable": "possiblePermissionIds",\n+ "mode": "w",\n+ "label": "Add permission",\n+ "description": "Permission needed to be able to add content of "\n+ "this type",\n },\n {\n- \'id\': \'klass\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Content type class\',\n- \'description\': \'Dotted name to the class that contains the \'\n- \'content type\'\n+ "id": "klass",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Content type class",\n+ "description": "Dotted name to the class that contains the " "content type",\n },\n {\n- \'id\': \'behaviors\',\n- \'type\': behaviors_type,\n- \'mode\': \'w\',\n- \'label\': \'Behaviors\',\n- \'description\': \'Names of enabled behaviors type\'\n+ "id": "behaviors",\n+ "type": behaviors_type,\n+ "mode": "w",\n+ "label": "Behaviors",\n+ "description": "Names of enabled behaviors type",\n },\n {\n- \'id\': \'schema\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Schema\',\n- \'description\': "Dotted name to the interface describing content "\n- "type\'s schema. This does not need to be given "\n- "if model_source or model_file are given, and "\n- "either contains an unnamed (default) schema."\n+ "id": "schema",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Schema",\n+ "description": "Dotted name to the interface describing content "\n+ "type\'s schema. This does not need to be given "\n+ "if model_source or model_file are given, and "\n+ "either contains an unnamed (default) schema.",\n },\n {\n- \'id\': \'model_source\',\n- \'type\': \'text\',\n- \'mode\': \'w\',\n- \'label\': \'Model source\',\n- \'description\': "XML source for the type\'s model. Note that this "\n- "takes precedence over any model file."\n+ "id": "model_source",\n+ "type": "text",\n+ "mode": "w",\n+ "label": "Model source",\n+ "description": "XML source for the type\'s model. Note that this "\n+ "takes precedence over any model file.",\n },\n {\n- \'id\': \'model_file\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Model file\',\n- \'description\': "Path to file containing the schema model. "\n- "This can be relative to a package, e.g. "\n- "\'my.package:myschema.xml\'."\n+ "id": "model_file",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Model file",\n+ "description": "Path to file containing the schema model. "\n+ "This can be relative to a package, e.g. "\n+ "\'my.package:myschema.xml\'.",\n },\n {\n- \'id\': \'schema_policy\',\n- \'type\': \'string\',\n- \'mode\': \'w\',\n- \'label\': \'Content type schema policy\',\n- \'description\': \'Name of the schema policy.\'\n+ "id": "schema_policy",\n+ "type": "string",\n+ "mode": "w",\n+ "label": "Content type schema policy",\n+ "description": "Name of the schema policy.",\n },\n-\n )\n \n default_aliases = {\n- \'(Default)\': \'(dynamic view)\',\n- \'view\': \'(selected layout)\',\n- \'edit\': \'@@edit\',\n- \'sharing\': \'@@sharing\',\n+ "(Default)": "(dynamic view)",\n+ "view": "(selected layout)",\n+ "edit": "@@edit",\n+ "sharing": "@@sharing",\n }\n \n default_actions = [\n {\n- \'id\': \'view\',\n- \'title\': \'View\',\n- \'action\': \'string:${object_url}\',\n- \'permissions\': (\'View\',)\n+ "id": "view",\n+ "title": "View",\n+ "action": "string:${object_url}",\n+ "permissions": ("View",),\n },\n {\n- \'id\': \'edit\',\n- \'title\': \'Edit\',\n- \'action\': \'string:${object_url}/edit\',\n- \'permissions\': (\'Modify portal content\',)\n+ "id": "edit",\n+ "title": "Edit",\n+ "action": "string:${object_url}/edit",\n+ "permissions": ("Modify portal content",),\n },\n ]\n \n- immediate_view = \'view\'\n- default_view = \'view\'\n- view_methods = (\'view\',)\n- add_permission = \'cmf.AddPortalContent\'\n+ immediate_view = "view"\n+ default_view = "view"\n+ view_methods = ("view",)\n+ add_permission = "cmf.AddPortalContent"\n behaviors = []\n- klass = \'plone.dexterity.content.Item\'\n+ klass = "plone.dexterity.content.Item"\n model_source = """\\\n \n \n@@ -151,18 +147,20 @@ class DexterityFTI(base.DynamicViewTypeInformation):\n def __init__(self, *args, **kwargs):\n super(DexterityFTI, self).__init__(*args, **kwargs)\n \n- if \'aliases\' not in kwargs:\n+ if "aliases" not in kwargs:\n self.setMethodAliases(self.default_aliases)\n \n- if \'actions\' not in kwargs:\n+ if "actions" not in kwargs:\n for action in self.default_actions:\n- self.addAction(id=action[\'id\'],\n- name=action[\'title\'],\n- action=action[\'action\'],\n- condition=action.get(\'condition\'),\n- permission=action.get(\'permissions\', ()),\n- category=action.get(\'category\', \'object\'),\n- visible=action.get(\'visible\', True))\n+ self.addAction(\n+ id=action["id"],\n+ name=action["title"],\n+ action=action["action"],\n+ condition=action.get("condition"),\n+ permission=action.get("permissions", ()),\n+ category=action.get("category", "object"),\n+ visible=action.get("visible", True),\n+ )\n \n # Default factory name to be the FTI name\n if not self.factory:\n@@ -186,31 +184,29 @@ def __init__(self, *args, **kwargs):\n \n if not self.add_view_expr:\n add_view_expr = kwargs.get(\n- \'add_view_expr\',\n- "string:${folder_url}/++add++%s" % self.getId()\n+ "add_view_expr", "string:${folder_url}/++add++%s" % self.getId()\n )\n- self._setPropValue(\'add_view_expr\', add_view_expr)\n+ self._setPropValue("add_view_expr", add_view_expr)\n \n # Set the content_meta_type from the klass\n \n klass = utils.resolveDottedName(self.klass)\n if klass is not None:\n- self.content_meta_type = getattr(klass, \'meta_type\', None)\n+ self.content_meta_type = getattr(klass, "meta_type", None)\n \n def Title(self):\n if self.title and self.i18n_domain:\n if six.PY2:\n try:\n- return Message(self.title.decode(\'utf8\'), self.i18n_domain)\n+ return Message(self.title.decode("utf8"), self.i18n_domain)\n except UnicodeDecodeError:\n- return Message(\n- self.title.decode(\'latin-1\'), self.i18n_domain)\n+ return Message(self.title.decode("latin-1"), self.i18n_domain)\n else:\n return Message(self.title, self.i18n_domain)\n else:\n if six.PY2:\n if self.title:\n- return self.title.decode(\'utf8\')\n+ return self.title.decode("utf8")\n return self.getId()\n return self.title or self.getId()\n \n@@ -218,16 +214,14 @@ def Description(self):\n if self.description and self.i18n_domain:\n if six.PY2:\n try:\n- return Message(\n- self.description.decode(\'utf8\'), self.i18n_domain)\n+ return Message(self.description.decode("utf8"), self.i18n_domain)\n except UnicodeDecodeError:\n- return Message(\n- self.description.decode(\'latin-1\'), self.i18n_domain)\n+ return Message(self.description.decode("latin-1"), self.i18n_domain)\n else:\n return Message(self.description, self.i18n_domain)\n else:\n if six.PY2 and self.description:\n- return self.description.decode(\'utf8\')\n+ return self.description.decode("utf8")\n return self.description\n \n def Metatype(self):\n@@ -236,12 +230,12 @@ def Metatype(self):\n # BBB - this didn\'t use to be set\n klass = utils.resolveDottedName(self.klass)\n if klass is not None:\n- self.content_meta_type = getattr(klass, \'meta_type\', None)\n+ self.content_meta_type = getattr(klass, "meta_type", None)\n return self.content_meta_type\n \n @property\n def hasDynamicSchema(self):\n- return not(self.schema)\n+ return not (self.schema)\n \n def lookupSchema(self):\n schema = None\n@@ -252,8 +246,8 @@ def lookupSchema(self):\n schema = utils.resolveDottedName(self.schema)\n except ImportError:\n logging.warning(\n- u"Dexterity type FTI %s: schema dotted name [%s] cannot be resolved." %\n- (self.getId(), self.schema)\n+ u"Dexterity type FTI %s: schema dotted name [%s] cannot be resolved."\n+ % (self.getId(), self.schema)\n )\n # fall through to return a fake class with no\n # fields so that end user code doesn\'t break\n@@ -306,10 +300,10 @@ def _updateProperty(self, id, value):\n modified(self, DexterityFTIModificationDescription(id, oldValue))\n \n # Update meta_type from klass\n- if id == \'klass\':\n+ if id == "klass":\n klass = utils.resolveDottedName(new_value)\n if klass is not None:\n- self.content_meta_type = getattr(klass, \'meta_type\', None)\n+ self.content_meta_type = getattr(klass, "meta_type", None)\n \n # Allow us to specify a particular add permission rather than rely on ones\n # stored in meta types that we don\'t have anyway\n@@ -322,54 +316,54 @@ def isConstructionAllowed(self, container):\n if permission is None:\n return False\n \n- return bool(\n- getSecurityManager().checkPermission(\n- permission.title,\n- container\n- )\n- )\n+ return bool(getSecurityManager().checkPermission(permission.title, container))\n \n #\n # Helper methods\n #\n \n def possiblePermissionIds(self):\n- """Get a vocabulary of Zope 3 permission ids\n- """\n+ """Get a vocabulary of Zope 3 permission ids"""\n permission_names = set()\n for permission in getAllUtilitiesRegisteredFor(IPermission):\n permission_names.add(permission.id)\n return sorted(permission_names)\n \n def _absModelFile(self):\n- colons = self.model_file.count(\':\')\n+ colons = self.model_file.count(":")\n model_file = self.model_file\n \n # We have a package and not an absolute Windows path\n- if colons == 1 and self.model_file[1:3] != \':\\\\\':\n- package, filename = self.model_file.split(\':\')\n+ if colons == 1 and self.model_file[1:3] != ":\\\\":\n+ package, filename = self.model_file.split(":")\n mod = utils.resolveDottedName(package)\n # let / work as path separator on all platforms\n- filename = filename.replace(\'/\', os.path.sep)\n+ filename = filename.replace("/", os.path.sep)\n model_file = os.path.join(os.path.split(mod.__file__)[0], filename)\n else:\n if not os.path.isabs(model_file):\n raise ValueError(\n u"Model file name %s is not an absolute path and does "\n u"not contain a package name in %s"\n- % (model_file, self.getId(),)\n+ % (\n+ model_file,\n+ self.getId(),\n+ )\n )\n \n if not os.path.isfile(model_file):\n raise ValueError(\n u"Model file %s in %s cannot be found"\n- % (model_file, self.getId(),)\n+ % (\n+ model_file,\n+ self.getId(),\n+ )\n )\n \n return model_file\n \n \n-def _fixProperties(class_, ignored=[\'product\', \'content_meta_type\']):\n+def _fixProperties(class_, ignored=["product", "content_meta_type"]):\n """Remove properties with the given ids, and ensure that later properties\n override earlier ones with the same id\n """\n@@ -379,17 +373,19 @@ def _fixProperties(class_, ignored=[\'product\', \'content_meta_type\']):\n for item in reversed(class_._properties):\n item = item.copy()\n \n- if item[\'id\'] in processed:\n+ if item["id"] in processed:\n continue\n \n # Ignore some fields\n- if item[\'id\'] in ignored:\n+ if item["id"] in ignored:\n continue\n \n properties.append(item)\n- processed.add(\'id\')\n+ processed.add("id")\n \n class_._properties = tuple(reversed(properties))\n+\n+\n _fixProperties(DexterityFTI)\n \n \n@@ -397,9 +393,9 @@ def _fixProperties(class_, ignored=[\'product\', \'content_meta_type\']):\n def register(fti):\n """Helper method to:\n \n- - register an FTI as a local utility\n- - register a local factory utility\n- - register an add view\n+ - register an FTI as a local utility\n+ - register a local factory utility\n+ - register an add view\n """\n \n fti = aq_base(fti) # remove acquisition wrapper\n@@ -411,10 +407,7 @@ def register(fti):\n fti_utility = queryUtility(IDexterityFTI, name=portal_type)\n if fti_utility is None:\n site_manager.registerUtility(\n- fti,\n- IDexterityFTI,\n- portal_type,\n- info=\'plone.dexterity.dynamic\'\n+ fti, IDexterityFTI, portal_type, info="plone.dexterity.dynamic"\n )\n \n factory_utility = queryUtility(IFactory, name=fti.factory)\n@@ -423,16 +416,16 @@ def register(fti):\n DexterityFactory(portal_type),\n IFactory,\n fti.factory,\n- info=\'plone.dexterity.dynamic\'\n+ info="plone.dexterity.dynamic",\n )\n \n \n def unregister(fti, old_name=None):\n """Helper method to:\n \n- - unregister the FTI local utility\n- - unregister any local factory utility associated with the FTI\n- - unregister any local add view associated with the FTI\n+ - unregister the FTI local utility\n+ - unregister any local factory utility associated with the FTI\n+ - unregister any local add view associated with the FTI\n """\n site = queryUtility(ISiteRoot)\n if site is None:\n@@ -455,21 +448,24 @@ def unregister_factory(factory_name, site_manager):\n utilities = list(site_manager.registeredUtilities())\n # Do nothing if an FTI is still using it\n if factory_name in [\n- f.component.factory for f in utilities\n- if (f.provided, f.info) == (IDexterityFTI, \'plone.dexterity.dynamic\')\n+ f.component.factory\n+ for f in utilities\n+ if (f.provided, f.info) == (IDexterityFTI, "plone.dexterity.dynamic")\n ]:\n return\n \n # If a factory with a matching name exists, remove it\n- if [f for f in utilities\n+ if [\n+ f\n+ for f in utilities\n if (f.provided, f.name, f.info)\n- == (IFactory, factory_name, \'plone.dexterity.dynamic\')]:\n+ == (IFactory, factory_name, "plone.dexterity.dynamic")\n+ ]:\n site_manager.unregisterUtility(provided=IFactory, name=factory_name)\n \n \n def ftiAdded(object, event):\n- """When the FTI is created, install local components\n- """\n+ """When the FTI is created, install local components"""\n \n if not IDexterityFTI.providedBy(event.object):\n return\n@@ -478,8 +474,7 @@ def ftiAdded(object, event):\n \n \n def ftiRemoved(object, event):\n- """When the FTI is removed, uninstall local coponents\n- """\n+ """When the FTI is removed, uninstall local coponents"""\n \n if not IDexterityFTI.providedBy(event.object):\n return\n@@ -488,15 +483,16 @@ def ftiRemoved(object, event):\n \n \n def ftiRenamed(object, event):\n- """When the FTI is modified, ensure local components are still valid\n- """\n+ """When the FTI is modified, ensure local components are still valid"""\n \n if not IDexterityFTI.providedBy(event.object):\n return\n \n- if event.oldParent is None \\\n- or event.newParent is None \\\n- or event.oldName == event.newName:\n+ if (\n+ event.oldParent is None\n+ or event.newParent is None\n+ or event.oldName == event.newName\n+ ):\n return\n \n unregister(event.object, event.oldName)\n@@ -523,8 +519,8 @@ def ftiModified(object, event):\n # was registered as a local utility to begin with. If so, remove the\n # orphan.\n \n- if \'factory\' in mod:\n- old_factory = mod[\'factory\']\n+ if "factory" in mod:\n+ old_factory = mod["factory"]\n \n site = getUtility(ISiteRoot)\n site_manager = getSiteManager(site)\n@@ -539,26 +535,29 @@ def ftiModified(object, event):\n DexterityFactory(portal_type),\n IFactory,\n fti.factory,\n- info=\'plone.dexterity.dynamic\'\n+ info="plone.dexterity.dynamic",\n )\n \n # Determine if we need to invalidate the schema at all\n- if \'behaviors\' in mod \\\n- or \'schema\' in mod \\\n- or \'model_source\' in mod \\\n- or \'model_file\' in mod \\\n- or \'schema_policy\' in mod:\n+ if (\n+ "behaviors" in mod\n+ or "schema" in mod\n+ or "model_source" in mod\n+ or "model_file" in mod\n+ or "schema_policy" in mod\n+ ):\n \n # Determine if we need to re-sync a dynamic schema\n- if (fti.model_source or fti.model_file) \\\n- and (\'model_source\' in mod or \'model_file\' in mod or \'schema_policy\' in mod):\n+ if (fti.model_source or fti.model_file) and (\n+ "model_source" in mod or "model_file" in mod or "schema_policy" in mod\n+ ):\n \n mtime = getattr(fti, "_p_mtime", None) or ""\n schemaName = portalTypeToSchemaName(portal_type, suffix=str(mtime))\n schema = getattr(plone.dexterity.schema.generated, schemaName)\n \n model = fti.lookupModel()\n- sync_bases = \'schema_policy\' in mod\n+ sync_bases = "schema_policy" in mod\n syncSchema(model.schema, schema, overwrite=True, sync_bases=sync_bases)\n \n notify(SchemaInvalidatedEvent(portal_type))\ndiff --git a/plone/dexterity/interfaces.py b/plone/dexterity/interfaces.py\nindex e36cbe8..cf5dc42 100644\n--- a/plone/dexterity/interfaces.py\n+++ b/plone/dexterity/interfaces.py\n@@ -12,16 +12,17 @@\n try:\n from zope.app.content import IContentType\n except ImportError:\n+\n class IContentType(Interface):\n pass\n \n+\n # id for pseudo-resource used to expose data for folderish items over WebDAV\n-DAV_FOLDER_DATA_ID = \'_data\'\n+DAV_FOLDER_DATA_ID = "_data"\n \n \n class IDexterityFTI(ITypeInformation):\n- """The Factory Type Information for Dexterity content objects\n- """\n+ """The Factory Type Information for Dexterity content objects"""\n \n def lookupSchema():\n """Return an InterfaceClass that represents the schema of this type.\n@@ -48,49 +49,45 @@ def lookupModel():\n add_permission = zope.schema.DottedName(\n title=u"Add permission",\n description=u"Zope 3 permission name for the permission required to "\n- u"construct this content",\n+ u"construct this content",\n )\n \n behaviors = zope.schema.List(\n title=u"Behaviors",\n description=u"A list of behaviors that are enabled for this type. "\n- u"See plone.behavior for more details.",\n- value_type=zope.schema.DottedName(title=u"Behavior name")\n+ u"See plone.behavior for more details.",\n+ value_type=zope.schema.DottedName(title=u"Behavior name"),\n )\n \n schema = zope.schema.DottedName(\n title=u"Schema interface",\n description=u"Dotted name to an interface describing the type. "\n- u"This is not required if there is a model file or a "\n- u"model source string containing an unnamed schema."\n+ u"This is not required if there is a model file or a "\n+ u"model source string containing an unnamed schema.",\n )\n \n model_source = zope.schema.Text(\n title=u"Model text",\n- description=u"XML representation of the model for this type. " +\n- u"If this is given, it will override any model_file."\n+ description=u"XML representation of the model for this type. "\n+ + u"If this is given, it will override any model_file.",\n )\n \n model_file = zope.schema.Text(\n title=u"Model file",\n description=u"A file that contains an XML model. "\n- u"This may be an absolute path, or one relative to a "\n- u"package, e.g. my.package:model.xml"\n+ u"This may be an absolute path, or one relative to a "\n+ u"package, e.g. my.package:model.xml",\n )\n \n hasDynamicSchema = zope.schema.Bool(\n- title=u"Whether or not the FTI uses a dynamic schema.",\n- readonly=True\n+ title=u"Whether or not the FTI uses a dynamic schema.", readonly=True\n )\n \n \n class IDexterityFTIModificationDescription(IModificationDescription):\n- """Descriptor passed with an IObjectModifiedEvent for a Dexterity FTI.\n- """\n+ """Descriptor passed with an IObjectModifiedEvent for a Dexterity FTI."""\n \n- attribute = zope.schema.ASCII(\n- title=u"Name of the attribute that was modified"\n- )\n+ attribute = zope.schema.ASCII(title=u"Name of the attribute that was modified")\n oldValue = Attribute("Old value")\n \n \n@@ -104,15 +101,13 @@ class IDexterityFactory(IFactory):\n """\n \n portal_type = zope.schema.TextLine(\n- title=u"Portal type name",\n- description=u"The portal type this is an FTI for"\n+ title=u"Portal type name", description=u"The portal type this is an FTI for"\n )\n \n \n # Schema\n class IDexteritySchema(Interface):\n- """Base class for Dexterity schemata\n- """\n+ """Base class for Dexterity schemata"""\n \n \n # Schema cache\n@@ -128,29 +123,24 @@ class ISchemaInvalidatedEvent(Interface):\n \n # Content\n class IDexterityContent(Interface):\n- """Marker interface for dexterity-managed content objects\n- """\n+ """Marker interface for dexterity-managed content objects"""\n \n \n class IDexterityItem(IDexterityContent):\n- """Marker interface applied to dexterity-managed non-folderish objects\n- """\n+ """Marker interface applied to dexterity-managed non-folderish objects"""\n \n \n class IDexterityContainer(IDexterityContent):\n- """Marker interface applied to dexterity-managed folderish objects\n- """\n+ """Marker interface applied to dexterity-managed folderish objects"""\n \n \n # Events\n class IBegunEvent(IObjectEvent):\n- """Base begun event\n- """\n+ """Base begun event"""\n \n \n class IEditBegunEvent(IBegunEvent):\n- """An edit operation was begun\n- """\n+ """An edit operation was begun"""\n \n \n class IAddBegunEvent(IBegunEvent):\n@@ -160,13 +150,11 @@ class IAddBegunEvent(IBegunEvent):\n \n \n class ICancelledEvent(IObjectEvent):\n- """Base cancel event\n- """\n+ """Base cancel event"""\n \n \n class IEditCancelledEvent(ICancelledEvent):\n- """An edit operation was cancelled\n- """\n+ """An edit operation was cancelled"""\n \n \n class IAddCancelledEvent(ICancelledEvent):\ndiff --git a/plone/dexterity/primary.py b/plone/dexterity/primary.py\nindex fb58ccc..759d530 100644\n--- a/plone/dexterity/primary.py\n+++ b/plone/dexterity/primary.py\n@@ -11,7 +11,6 @@\n @implementer(IPrimaryFieldInfo)\n @adapter(IDexterityContent)\n class PrimaryFieldInfo(object):\n-\n def __init__(self, context):\n self.context = context\n primary = None\n@@ -22,7 +21,7 @@ def __init__(self, context):\n primary = (name, field)\n break\n if not primary:\n- raise TypeError(\'Could not adapt\', context, IPrimaryFieldInfo)\n+ raise TypeError("Could not adapt", context, IPrimaryFieldInfo)\n self.fieldname, self.field = primary\n \n @property\ndiff --git a/plone/dexterity/schema.py b/plone/dexterity/schema.py\nindex 0e1d41d..c913609 100644\n--- a/plone/dexterity/schema.py\n+++ b/plone/dexterity/schema.py\n@@ -32,22 +32,22 @@\n log = logging.getLogger(__name__)\n \n # Dynamic modules\n-generated = dynamic.create(\'plone.dexterity.schema.generated\')\n-transient = types.ModuleType(\'transient\')\n+generated = dynamic.create("plone.dexterity.schema.generated")\n+transient = types.ModuleType("transient")\n \n _MARKER = dict()\n \n-FTI_CACHE_KEY = \'__plone_dexterity_fti_cache__\'\n+FTI_CACHE_KEY = "__plone_dexterity_fti_cache__"\n \n \n def invalidate_cache(fti):\n fti._p_activate()\n- fti.__dict__.pop(\'_v_schema_get\', None)\n- fti.__dict__.pop(\'_v_schema_behavior_registrations\', None)\n- fti.__dict__.pop(\'_v_schema_subtypes\', None)\n- fti.__dict__.pop(\'_v_schema_schema_interfaces\', None)\n- fti.__dict__.pop(\'_v_schema_modified\', None)\n- fti.__dict__.pop(\'_v_schema_behavior_schema_interfaces\', None)\n+ fti.__dict__.pop("_v_schema_get", None)\n+ fti.__dict__.pop("_v_schema_behavior_registrations", None)\n+ fti.__dict__.pop("_v_schema_subtypes", None)\n+ fti.__dict__.pop("_v_schema_schema_interfaces", None)\n+ fti.__dict__.pop("_v_schema_modified", None)\n+ fti.__dict__.pop("_v_schema_behavior_schema_interfaces", None)\n request = getRequest()\n if request:\n setattr(request, FTI_CACHE_KEY, None)\n@@ -69,8 +69,7 @@ def lookup_fti(portal_type, cache=True):\n fti = fti_cache[portal_type]\n else:\n fti_cache[portal_type] = fti = queryUtility(\n- IDexterityFTI,\n- name=portal_type\n+ IDexterityFTI, name=portal_type\n )\n return fti\n return queryUtility(IDexterityFTI, name=portal_type)\n@@ -78,12 +77,11 @@ def lookup_fti(portal_type, cache=True):\n # its already an IDexterityFTI instance\n return portal_type\n raise ValueError(\n- \'portal_type has to either string or IDexterityFTI instance but is \'\n- \'{0!r}\'.format(portal_type)\n+ "portal_type has to either string or IDexterityFTI instance but is "\n+ "{0!r}".format(portal_type)\n )\n \n \n-\n def volatile(func):\n @functools.wraps(func)\n def decorator(self, portal_type):\n@@ -100,7 +98,7 @@ def decorator(self, portal_type):\n if fti is None:\n return func(self, None)\n if self.cache_enabled:\n- key = \'_v_schema_%s\' % func.__name__\n+ key = "_v_schema_%s" % func.__name__\n cache = getattr(fti, key, _MARKER)\n if cache is not _MARKER:\n mtime, value = cache\n@@ -113,6 +111,7 @@ def decorator(self, portal_type):\n setattr(fti, key, (fti._p_mtime, value))\n \n return value\n+\n return decorator\n \n \n@@ -177,10 +176,8 @@ def behavior_registrations(self, fti):\n warnings.warn(\n \'No behavior registration found for behavior named "{0}"\'\n \' for factory "{1}"\'\n- \' - trying deprecated fallback lookup (will be removed \'\n- \'in 3.0)..."\'.format(\n- behavior_name, fti.getId()\n- ),\n+ " - trying deprecated fallback lookup (will be removed "\n+ \'in 3.0)..."\'.format(behavior_name, fti.getId()),\n DeprecationWarning,\n )\n try:\n@@ -197,7 +194,7 @@ def behavior_registrations(self, fti):\n description="bbb fallback lookup",\n interface=schema_interface,\n marker=None,\n- factory=None\n+ factory=None,\n )\n registrations.append(registration)\n return tuple(registrations)\n@@ -212,8 +209,10 @@ def subtypes(self, fti):\n return ()\n subtypes = []\n for behavior_registration in self.behavior_registrations(fti):\n- if behavior_registration is not None \\\n- and behavior_registration.marker is not None:\n+ if (\n+ behavior_registration is not None\n+ and behavior_registration.marker is not None\n+ ):\n subtypes.append(behavior_registration.marker)\n return tuple(subtypes)\n \n@@ -227,8 +226,7 @@ def behavior_schema_interfaces(self, fti):\n return ()\n schemas = []\n for behavior_registration in self.behavior_registrations(fti):\n- if behavior_registration is not None \\\n- and behavior_registration.interface:\n+ if behavior_registration is not None and behavior_registration.interface:\n schemas.append(behavior_registration.interface)\n return tuple(schemas)\n \n@@ -279,7 +277,6 @@ def modified(self, fti):\n \n @implementer(ISchemaInvalidatedEvent)\n class SchemaInvalidatedEvent(object):\n-\n def __init__(self, portal_type):\n self.portal_type = portal_type\n \n@@ -294,15 +291,14 @@ def invalidate_schema(event):\n \n # here starts the code dealing wih dynamic schemas.\n class SchemaNameEncoder(object):\n- """Schema name encoding\n- """\n+ """Schema name encoding"""\n \n key = (\n- (\' \', \'_1_\'),\n- (\'.\', \'_2_\'),\n- (\'-\', \'_3_\'),\n- (\'/\', \'_4_\'),\n- (\'|\', \'_5_\'),\n+ (" ", "_1_"),\n+ (".", "_2_"),\n+ ("-", "_3_"),\n+ ("/", "_4_"),\n+ ("|", "_5_"),\n )\n \n def encode(self, s):\n@@ -316,34 +312,31 @@ def decode(self, s):\n return s\n \n def join(self, *args):\n- return \'_0_\'.join([self.encode(a) for a in args if a])\n+ return "_0_".join([self.encode(a) for a in args if a])\n \n def split(self, s):\n- return [self.decode(a) for a in s.split(\'_0_\')]\n+ return [self.decode(a) for a in s.split("_0_")]\n \n \n def portalTypeToSchemaName(portal_type, schema=u"", prefix=None, suffix=None):\n- """Return a canonical interface name for a generated schema interface.\n- """\n+ """Return a canonical interface name for a generated schema interface."""\n if prefix is None:\n- prefix = \'/\'.join(getUtility(ISiteRoot).getPhysicalPath())[1:]\n+ prefix = "/".join(getUtility(ISiteRoot).getPhysicalPath())[1:]\n if suffix:\n- prefix = \'|\'.join([prefix, suffix])\n+ prefix = "|".join([prefix, suffix])\n \n encoder = SchemaNameEncoder()\n return encoder.join(prefix, portal_type, schema)\n \n \n def schemaNameToPortalType(schemaName):\n- """Return a the portal_type part of a schema name\n- """\n+ """Return a the portal_type part of a schema name"""\n encoder = SchemaNameEncoder()\n return encoder.split(schemaName)[1]\n \n \n def splitSchemaName(schemaName):\n- """Return a tuple prefix, portal_type, schemaName\n- """\n+ """Return a tuple prefix, portal_type, schemaName"""\n encoder = SchemaNameEncoder()\n items = encoder.split(schemaName)\n if len(items) == 2:\n@@ -357,8 +350,7 @@ def splitSchemaName(schemaName):\n # Dynamic module factory\n @implementer(IDynamicObjectFactory)\n class SchemaModuleFactory(object):\n- """Create dynamic schema interfaces on the fly\n- """\n+ """Create dynamic schema interfaces on the fly"""\n \n lock = RLock()\n _transient_SCHEMA_CACHE = {}\n@@ -429,7 +421,7 @@ class DexteritySchemaPolicy(object):\n """\n \n def module(self, schemaName, tree):\n- return \'plone.dexterity.schema.transient\'\n+ return "plone.dexterity.schema.transient"\n \n def bases(self, schemaName, tree):\n return ()\n@@ -438,4 +430,4 @@ def name(self, schemaName, tree):\n # We use a temporary name whilst the interface is being generated;\n # when it\'s first used, we know the portal_type and site, and can\n # thus update it\n- return \'__tmp__\' + schemaName\n+ return "__tmp__" + schemaName\ndiff --git a/plone/dexterity/tests/case.py b/plone/dexterity/tests/case.py\nindex 04fb32e..9b6b879 100644\n--- a/plone/dexterity/tests/case.py\n+++ b/plone/dexterity/tests/case.py\n@@ -15,8 +15,7 @@\n \n \n class MockTestCase(unittest.TestCase):\n- """Base class for tests using mocks.\n- """\n+ """Base class for tests using mocks."""\n \n _getToolByName_return_values = None\n _replaced_globals = None\n@@ -38,27 +37,25 @@ def create_dummy(self, **kw):\n # wipe the registry each time.\n \n def mock_utility(self, mock, provides, name=u""):\n- """Register the mock as a utility providing the given interface\n- """\n- zope.component.provideUtility(\n- provides=provides, component=mock, name=name)\n+ """Register the mock as a utility providing the given interface"""\n+ zope.component.provideUtility(provides=provides, component=mock, name=name)\n \n def mock_adapter(self, mock, provides, adapts, name=u""):\n """Register the mock as an adapter providing the given interface\n and adapting the given interface(s)\n """\n zope.component.provideAdapter(\n- factory=mock, adapts=adapts, provides=provides, name=name)\n+ factory=mock, adapts=adapts, provides=provides, name=name\n+ )\n \n def mock_subscription_adapter(self, mock, provides, adapts):\n- """Register the mock as a utility providing the given interface\n- """\n+ """Register the mock as a utility providing the given interface"""\n zope.component.provideSubscriptionAdapter(\n- factory=mock, provides=provides, adapts=adapts)\n+ factory=mock, provides=provides, adapts=adapts\n+ )\n \n def mock_handler(self, mock, adapts):\n- """Register the mock as a utility providing the given interface\n- """\n+ """Register the mock as a utility providing the given interface"""\n zope.component.provideHandler(factory=mock, adapts=adapts)\n \n def mock_tool(self, mock, name):\n@@ -72,8 +69,8 @@ def get_return_value(context, name, default=None):\n return return_values.get(name, default)\n \n from Products.CMFCore.utils import getToolByName\n- self.patch_global(\n- getToolByName, side_effect=get_return_value)\n+\n+ self.patch_global(getToolByName, side_effect=get_return_value)\n self._getToolByName_return_values[name] = mock\n \n def patch_global(self, orig, mock=None, **kw):\n@@ -81,7 +78,8 @@ def patch_global(self, orig, mock=None, **kw):\n mock = Mock(**kw)\n elif kw:\n raise Exception(\n- \'Keyword arguments are ignored if a mock instance is passed.\')\n+ "Keyword arguments are ignored if a mock instance is passed."\n+ )\n _global_replace(orig, mock)\n if self._replaced_globals is None:\n self._replaced_globals = {}\n@@ -90,18 +88,17 @@ def patch_global(self, orig, mock=None, **kw):\n \n \n class Dummy(object):\n- """Dummy object with arbitrary attributes\n- """\n+ """Dummy object with arbitrary attributes"""\n \n def __init__(self, **kw):\n self.__dict__.update(kw)\n \n \n class ItemDummy(Dummy):\n- """ Dummy objects with title getter and setter """\n+ """Dummy objects with title getter and setter"""\n \n- title = \'\'\n- portal_type = \'foo\'\n+ title = ""\n+ portal_type = "foo"\n \n def Title(self):\n return self.title\n@@ -110,14 +107,14 @@ def setTitle(self, title):\n self.title = title\n \n def getId(self):\n- return self.__dict__.get(\'id\', \'\')\n+ return self.__dict__.get("id", "")\n \n \n # from mocker\n def _global_replace(remove, install):\n """Replace object \'remove\' with object \'install\' on all dictionaries."""\n for referrer in gc.get_referrers(remove):\n- if (type(referrer) is dict):\n+ if type(referrer) is dict:\n for key, value in list(six.iteritems(referrer)):\n if value is remove:\n referrer[key] = install\ndiff --git a/plone/dexterity/tests/schemata.py b/plone/dexterity/tests/schemata.py\nindex e99ef8a..d9ff6be 100644\n--- a/plone/dexterity/tests/schemata.py\n+++ b/plone/dexterity/tests/schemata.py\n@@ -5,23 +5,19 @@\n \n \n class ITestSchema(Interface):\n- """Schema used for testing\n- """\n+ """Schema used for testing"""\n \n- title = schema.TextLine(title=u"Title",\n- description=u"Administrative title")\n+ title = schema.TextLine(title=u"Title", description=u"Administrative title")\n \n- description = schema.Text(title=u"Description",\n- required=False)\n+ description = schema.Text(title=u"Description", required=False)\n \n \n class ITaggedValueSchema(Interface):\n- """Schema used for testing tagged value filenames\n- """\n+ """Schema used for testing tagged value filenames"""\n \n-ITaggedValueSchema.setTaggedValue(FILENAME_KEY, \'/path/to/dummy.xml\')\n+\n+ITaggedValueSchema.setTaggedValue(FILENAME_KEY, "/path/to/dummy.xml")\n \n \n class IDerivedFromTaggedValueSchema(ITaggedValueSchema):\n- """Schema used for testing tagged value filenames\n- """\n+ """Schema used for testing tagged value filenames"""\ndiff --git a/plone/dexterity/tests/test_behavior.py b/plone/dexterity/tests/test_behavior.py\nindex fecad85..dcf3264 100644\n--- a/plone/dexterity/tests/test_behavior.py\n+++ b/plone/dexterity/tests/test_behavior.py\n@@ -24,7 +24,6 @@ class IFour(IThree):\n \n \n class TestBehavior(MockTestCase):\n-\n def test_supports(self):\n \n # Context mock\n@@ -32,17 +31,9 @@ def test_supports(self):\n \n # Behavior mock\n behavior_dummy_1 = self.create_dummy(interface=IOne)\n- self.mock_utility(\n- behavior_dummy_1,\n- IBehavior,\n- name=IOne.__identifier__\n- )\n+ self.mock_utility(behavior_dummy_1, IBehavior, name=IOne.__identifier__)\n behavior_dummy_4 = self.create_dummy(interface=IFour)\n- self.mock_utility(\n- behavior_dummy_4,\n- IBehavior,\n- name=IFour.__identifier__\n- )\n+ self.mock_utility(behavior_dummy_4, IBehavior, name=IFour.__identifier__)\n \n # FTI mock\n fti = DexterityFTI(u"testtype")\n@@ -72,7 +63,4 @@ def test_enumerate(self):\n \n assignable = DexterityBehaviorAssignable(context_dummy)\n \n- self.assertEqual(\n- [behavior_dummy],\n- list(assignable.enumerateBehaviors())\n- )\n+ self.assertEqual([behavior_dummy], list(assignable.enumerateBehaviors()))\ndiff --git a/plone/dexterity/tests/test_content.py b/plone/dexterity/tests/test_content.py\nindex bd86c50..2844138 100644\n--- a/plone/dexterity/tests/test_content.py\n+++ b/plone/dexterity/tests/test_content.py\n@@ -41,14 +41,12 @@\n \n \n class TestContent(MockTestCase):\n-\n def setUp(self):\n SCHEMA_CACHE.clear()\n provideAdapter(DefaultOrdering)\n provideAdapter(AttributeAnnotations)\n \n def test_provided_by_item(self):\n-\n class FauxDataManager(object):\n def setstate(self, obj):\n pass\n@@ -60,8 +58,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = Item(id=u\'id\')\n- item.portal_type = u\'testtype\'\n+ item = Item(id=u"id")\n+ item.portal_type = u"testtype"\n item._p_jar = FauxDataManager()\n \n # Dummy schema\n@@ -73,7 +71,7 @@ class IMarker(Interface):\n pass\n \n # FTI mock\n- fti_mock = Mock(wraps=DexterityFTI(\'testtype\'))\n+ fti_mock = Mock(wraps=DexterityFTI("testtype"))\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n@@ -115,8 +113,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n item._p_jar = FauxDataManager()\n \n # Dummy schema\n@@ -158,8 +156,8 @@ class MyItem(Item):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n \n # Without a persistence jar, the _p_changed check doesn\'t work. In\n # this case, the cache is a bit slower.\n@@ -218,8 +216,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n \n # Without a persistence jar, the _p_changed check doesn\'t work. In\n # this case, the cache is a bit slower.\n@@ -236,21 +234,13 @@ class ISchema(Interface):\n \n # Behaviors - one with a subtype and one without\n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n class IBehavior1(Interface):\n pass\n \n- behavior1 = BehaviorRegistration(\n- u"Behavior1",\n- "",\n- IBehavior1,\n- None,\n- None\n- )\n+ behavior1 = BehaviorRegistration(u"Behavior1", "", IBehavior1, None, None)\n self.mock_utility(behavior1, IBehavior, name="behavior1")\n \n class IBehavior2(Interface):\n@@ -259,19 +249,13 @@ class IBehavior2(Interface):\n class IMarker2(Interface):\n pass\n \n- behavior2 = BehaviorRegistration(\n- u"Behavior2",\n- "",\n- IBehavior2,\n- IMarker2,\n- None\n- )\n+ behavior2 = BehaviorRegistration(u"Behavior2", "", IBehavior2, IMarker2, None)\n self.mock_utility(behavior2, IBehavior, name="behavior2")\n \n # FTI mock\n fti_mock = Mock(wraps=DexterityFTI(u"testtype"))\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n- fti_mock.behaviors = [\'behavior1\', \'behavior2\']\n+ fti_mock.behaviors = ["behavior1", "behavior2"]\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n alsoProvides(fti_mock, IDexterityFTI)\n \n@@ -325,8 +309,8 @@ def register(self, obj):\n pass\n \n # Dummy instance\n- item = MyItem(id=u\'id\')\n- item.portal_type = \'testtype\'\n+ item = MyItem(id=u"id")\n+ item.portal_type = "testtype"\n \n # Without a persistence jar, the _p_changed check doesn\'t work. In\n # this case, the cache is a bit slower.\n@@ -345,13 +329,7 @@ class ISchema(Interface):\n class IBehavior1(Interface):\n pass\n \n- behavior1 = BehaviorRegistration(\n- u"Behavior1",\n- "",\n- IBehavior1,\n- None,\n- None\n- )\n+ behavior1 = BehaviorRegistration(u"Behavior1", "", IBehavior1, None, None)\n self.mock_utility(behavior1, IBehavior, name="behavior1")\n \n class IBehavior2(Interface):\n@@ -360,13 +338,7 @@ class IBehavior2(Interface):\n class IMarker2(Interface):\n pass\n \n- behavior2 = BehaviorRegistration(\n- u"Behavior2",\n- "",\n- IBehavior2,\n- IMarker2,\n- None\n- )\n+ behavior2 = BehaviorRegistration(u"Behavior2", "", IBehavior2, IMarker2, None)\n self.mock_utility(behavior2, IBehavior, name="behavior2")\n \n class IBehavior3(Interface):\n@@ -375,19 +347,11 @@ class IBehavior3(Interface):\n class IMarker3(Interface):\n pass\n \n- behavior3 = BehaviorRegistration(\n- u"Behavior3",\n- "",\n- IBehavior3,\n- IMarker3,\n- None\n- )\n+ behavior3 = BehaviorRegistration(u"Behavior3", "", IBehavior3, IMarker3, None)\n self.mock_utility(behavior3, IBehavior, name="behavior3")\n \n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n # FTI mock\n@@ -396,8 +360,8 @@ class IMarker3(Interface):\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # start clean\n- SCHEMA_CACHE.invalidate(\'testtype\')\n- fti_mock.behaviors = [\'behavior1\', \'behavior2\']\n+ SCHEMA_CACHE.invalidate("testtype")\n+ fti_mock.behaviors = ["behavior1", "behavior2"]\n \n # implementedBy does not look into the fti\n self.assertFalse(ISchema.implementedBy(MyItem))\n@@ -413,8 +377,8 @@ class IMarker3(Interface):\n \n # If we now invalidate the schema cache, we should get the\n # SECOND set of behaviors (which includes behavior3)\n- SCHEMA_CACHE.invalidate(\'testtype\')\n- fti_mock.behaviors = [\'behavior1\', \'behavior2\', \'behavior3\']\n+ SCHEMA_CACHE.invalidate("testtype")\n+ fti_mock.behaviors = ["behavior1", "behavior2", "behavior3"]\n \n # Main schema as looked up in FTI is now provided by item ...\n self.assertTrue(ISchema.providedBy(item))\n@@ -448,12 +412,12 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n self.assertEqual(u"foo_default", content.foo)\n self.assertEqual(None, content.bar)\n self.assertEqual(u"id", content.id)\n- self.assertRaises(AttributeError, getattr, content, \'baz\')\n+ self.assertRaises(AttributeError, getattr, content, "baz")\n \n def test_getattr_consults_schema_container(self):\n \n@@ -470,12 +434,12 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n self.assertEqual(u"foo_default", content.foo)\n self.assertEqual(None, content.bar)\n self.assertEqual(u"id", content.id)\n- self.assertRaises(AttributeError, getattr, content, \'baz\')\n+ self.assertRaises(AttributeError, getattr, content, "baz")\n \n def test_getattr_consults_schema_item_default_factory_with_context(self):\n \n@@ -491,8 +455,7 @@ def defaultFactory(context):\n return u"{0:s}_{1:s}".format(context.id, context.portal_type)\n \n class ISchema(Interface):\n- foo = zope.schema.TextLine(title=u"foo",\n- defaultFactory=defaultFactory)\n+ foo = zope.schema.TextLine(title=u"foo", defaultFactory=defaultFactory)\n bar = zope.schema.TextLine(title=u"bar")\n \n # FTI mock\n@@ -500,12 +463,12 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n self.assertEqual(u"id_testtype", content.foo)\n self.assertEqual(None, content.bar)\n self.assertEqual(u"id", content.id)\n- self.assertRaises(AttributeError, getattr, content, \'baz\')\n+ self.assertRaises(AttributeError, getattr, content, "baz")\n \n def test_getattr_on_container_returns_children(self):\n \n@@ -513,8 +476,8 @@ def test_getattr_on_container_returns_children(self):\n content.id = u"id"\n content.portal_type = u"testtype"\n \n- content[\'foo\'] = Item(\'foo\')\n- content[\'quux\'] = Item(\'quux\')\n+ content["foo"] = Item("foo")\n+ content["quux"] = Item("quux")\n \n class ISchema(Interface):\n foo = zope.schema.TextLine(title=u"foo", default=u"foo_default")\n@@ -525,30 +488,30 @@ class ISchema(Interface):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n \n # Schema field masks contained item\n self.assertEqual(u"foo_default", content.foo)\n \n # But we can still obtain an item\n- self.assertTrue(isinstance(content[\'foo\'], Item))\n- self.assertEqual(\'foo\', content[\'foo\'].id)\n+ self.assertTrue(isinstance(content["foo"], Item))\n+ self.assertEqual("foo", content["foo"].id)\n \n # And if the item isn\'t masked by an attribute, we can still getattr it\n- self.assertTrue(isinstance(content[\'quux\'], Item))\n- self.assertEqual(\'quux\', content[\'quux\'].id)\n+ self.assertTrue(isinstance(content["quux"], Item))\n+ self.assertEqual("quux", content["quux"].id)\n \n- self.assertTrue(isinstance(getattr(content, \'quux\'), Item))\n- self.assertEqual(\'quux\', getattr(content, \'quux\').id)\n+ self.assertTrue(isinstance(getattr(content, "quux"), Item))\n+ self.assertEqual("quux", getattr(content, "quux").id)\n \n def test_ZMI_manage_options_container(self):\n # Make sure we get the expected tabs in the ZMI\n \n- containerOptions = [o[\'label\'] for o in Container.manage_options]\n+ containerOptions = [o["label"] for o in Container.manage_options]\n tabs = [\n- \'Security\',\n- \'Contents\',\n- \'Properties\',\n+ "Security",\n+ "Contents",\n+ "Properties",\n ]\n for tab in tabs:\n self.assertTrue(tab in containerOptions, "Tab %s not found" % tab)\n@@ -556,11 +519,11 @@ def test_ZMI_manage_options_container(self):\n def test_ZMI_manage_options_item(self):\n # Make sure we get the expected tabs in the ZMI\n \n- containerOptions = [o[\'label\'] for o in Item.manage_options]\n+ containerOptions = [o["label"] for o in Item.manage_options]\n tabs = [\n- \'Security\',\n- \'View\',\n- \'Properties\',\n+ "Security",\n+ "View",\n+ "Properties",\n ]\n for tab in tabs:\n self.assertTrue(tab in containerOptions, "Tab %s not found" % tab)\n@@ -568,35 +531,34 @@ def test_ZMI_manage_options_item(self):\n def test_name_and_id_in_sync(self):\n \n i = Item()\n- self.assertEqual(\'\', i.id)\n- self.assertEqual(\'\', i.getId())\n- self.assertEqual(u\'\', i.__name__)\n+ self.assertEqual("", i.id)\n+ self.assertEqual("", i.getId())\n+ self.assertEqual(u"", i.__name__)\n \n i = Item()\n i.id = "foo"\n- self.assertEqual(\'foo\', i.id)\n- self.assertEqual(\'foo\', i.getId())\n- self.assertEqual(u\'foo\', i.__name__)\n+ self.assertEqual("foo", i.id)\n+ self.assertEqual("foo", i.getId())\n+ self.assertEqual(u"foo", i.__name__)\n \n i = Item()\n i.__name__ = u"foo"\n- self.assertEqual(\'foo\', i.id)\n- self.assertEqual(\'foo\', i.getId())\n- self.assertEqual(u\'foo\', i.__name__)\n+ self.assertEqual("foo", i.id)\n+ self.assertEqual("foo", i.getId())\n+ self.assertEqual(u"foo", i.__name__)\n \n def test_name_unicode_id_str(self):\n \n i = Item()\n if six.PY2:\n try:\n- i.__name__ = b\'\\xc3\\xb8\'.decode(\'utf-8\')\n+ i.__name__ = b"\\xc3\\xb8".decode("utf-8")\n except UnicodeEncodeError:\n pass\n else:\n self.fail()\n else:\n- i.__name__ = b\'\\xc3\\xb8\'.decode(\'utf-8\')\n-\n+ i.__name__ = b"\\xc3\\xb8".decode("utf-8")\n \n i.__name__ = u"o"\n \n@@ -613,56 +575,53 @@ def test_item_dublincore(self):\n \n import plone.dexterity\n \n- datetime_patcher = patch.object(plone.dexterity.content, \'DateTime\')\n+ datetime_patcher = patch.object(plone.dexterity.content, "DateTime")\n mocked_datetime = datetime_patcher.start()\n mocked_datetime.return_value = DateTime(2014, 6, 1)\n self.addCleanup(datetime_patcher.stop)\n \n i = Item(\n title=u"Emperor Penguin",\n- description=u\'One of the most magnificent birds.\',\n- subject=u\'Penguins\',\n- contributors=u\'admin\',\n+ description=u"One of the most magnificent birds.",\n+ subject=u"Penguins",\n+ contributors=u"admin",\n effective_date="08/20/2010",\n expiration_date="07/09/2013",\n- format=\'text/plain\',\n- language=\'de\',\n- rights=\'CC\',\n+ format="text/plain",\n+ language="de",\n+ rights="CC",\n )\n \n summer_timezone = i.effective_date.timezone()\n self.assertEqual(i.title, u"Emperor Penguin")\n- self.assertEqual(i.Title(), \'Emperor Penguin\')\n- self.assertEqual(i.description, u\'One of the most magnificent birds.\')\n- self.assertEqual(i.Description(), \'One of the most magnificent birds.\')\n- self.assertEqual(i.subject, (u\'Penguins\',))\n- self.assertEqual(i.Subject(), (\'Penguins\',))\n- self.assertEqual(i.contributors, (u\'admin\',))\n- self.assertEqual(i.listContributors(), (\'admin\',))\n- self.assertEqual(i.Contributors(), (\'admin\',))\n- self.assertEqual(i.format, \'text/plain\')\n- self.assertEqual(i.effective_date, DateTime(\'08/20/2010\'))\n- self.assertEqual(\n- i.EffectiveDate(zone=summer_timezone)[:10], \'2010-08-20\')\n- self.assertEqual(i.effective(), DateTime(\'08/20/2010\'))\n- self.assertEqual(i.expiration_date, DateTime(\'07/09/2013\'))\n- self.assertEqual(\n- i.ExpirationDate(zone=summer_timezone)[:10], \'2013-07-09\')\n- self.assertEqual(i.expires(), DateTime(\'07/09/2013\'))\n- self.assertEqual(i.language, \'de\')\n- self.assertEqual(i.Language(), \'de\')\n- self.assertEqual(i.rights, \'CC\')\n- self.assertEqual(i.Rights(), \'CC\')\n+ self.assertEqual(i.Title(), "Emperor Penguin")\n+ self.assertEqual(i.description, u"One of the most magnificent birds.")\n+ self.assertEqual(i.Description(), "One of the most magnificent birds.")\n+ self.assertEqual(i.subject, (u"Penguins",))\n+ self.assertEqual(i.Subject(), ("Penguins",))\n+ self.assertEqual(i.contributors, (u"admin",))\n+ self.assertEqual(i.listContributors(), ("admin",))\n+ self.assertEqual(i.Contributors(), ("admin",))\n+ self.assertEqual(i.format, "text/plain")\n+ self.assertEqual(i.effective_date, DateTime("08/20/2010"))\n+ self.assertEqual(i.EffectiveDate(zone=summer_timezone)[:10], "2010-08-20")\n+ self.assertEqual(i.effective(), DateTime("08/20/2010"))\n+ self.assertEqual(i.expiration_date, DateTime("07/09/2013"))\n+ self.assertEqual(i.ExpirationDate(zone=summer_timezone)[:10], "2013-07-09")\n+ self.assertEqual(i.expires(), DateTime("07/09/2013"))\n+ self.assertEqual(i.language, "de")\n+ self.assertEqual(i.Language(), "de")\n+ self.assertEqual(i.rights, "CC")\n+ self.assertEqual(i.Rights(), "CC")\n self.assertEqual(i.creation_date, i.created())\n self.assertEqual(\n- i.CreationDate(zone=summer_timezone)[:19],\n- i.creation_date.ISO()[:19]\n+ i.CreationDate(zone=summer_timezone)[:19], i.creation_date.ISO()[:19]\n )\n self.assertEqual(i.modification_date, i.creation_date)\n self.assertEqual(i.modification_date, i.modified())\n self.assertEqual(\n i.ModificationDate(zone=summer_timezone)[:19],\n- i.modification_date.ISO()[:19]\n+ i.modification_date.ISO()[:19],\n )\n self.assertEqual(i.Date(), i.EffectiveDate())\n self.assertEqual(i.Identifier(), i.absolute_url())\n@@ -671,42 +630,40 @@ def test_item_dublincore_date(self):\n from DateTime import DateTime\n \n import plone.dexterity\n- datetime_patcher = patch.object(plone.dexterity.content, \'DateTime\')\n+\n+ datetime_patcher = patch.object(plone.dexterity.content, "DateTime")\n mocked_datetime = datetime_patcher.start()\n mocked_datetime.return_value = DateTime(2014, 6, 1)\n self.addCleanup(datetime_patcher.stop)\n \n i = Item(\n title=u"Emperor Penguin",\n- description=u\'One of the most magnificent birds.\',\n- subject=u\'Penguins\',\n- contributors=u\'admin\',\n+ description=u"One of the most magnificent birds.",\n+ subject=u"Penguins",\n+ contributors=u"admin",\n effective_date=date(2010, 8, 20),\n expiration_date=date(2013, 7, 9),\n- format=\'text/plain\',\n- language=\'de\',\n- rights=\'CC\',\n+ format="text/plain",\n+ language="de",\n+ rights="CC",\n )\n \n- summer_timezone = DateTime(\'2010/08/20\').timezone()\n- self.assertEqual(i.effective_date, DateTime(\'08/20/2010\'))\n- self.assertEqual(\n- i.EffectiveDate(zone=summer_timezone)[:10], \'2010-08-20\')\n- self.assertEqual(i.effective(), DateTime(\'08/20/2010\'))\n- self.assertEqual(i.expiration_date, DateTime(\'07/09/2013\'))\n- self.assertEqual(\n- i.ExpirationDate(zone=summer_timezone)[:10], \'2013-07-09\')\n- self.assertEqual(i.expires(), DateTime(\'07/09/2013\'))\n+ summer_timezone = DateTime("2010/08/20").timezone()\n+ self.assertEqual(i.effective_date, DateTime("08/20/2010"))\n+ self.assertEqual(i.EffectiveDate(zone=summer_timezone)[:10], "2010-08-20")\n+ self.assertEqual(i.effective(), DateTime("08/20/2010"))\n+ self.assertEqual(i.expiration_date, DateTime("07/09/2013"))\n+ self.assertEqual(i.ExpirationDate(zone=summer_timezone)[:10], "2013-07-09")\n+ self.assertEqual(i.expires(), DateTime("07/09/2013"))\n self.assertEqual(i.creation_date, i.created())\n self.assertEqual(\n- i.CreationDate(zone=summer_timezone)[:19],\n- i.creation_date.ISO()[:19]\n+ i.CreationDate(zone=summer_timezone)[:19], i.creation_date.ISO()[:19]\n )\n self.assertEqual(i.modification_date, i.creation_date)\n self.assertEqual(i.modification_date, i.modified())\n self.assertEqual(\n i.ModificationDate(zone=summer_timezone)[:19],\n- i.modification_date.ISO()[:19]\n+ i.modification_date.ISO()[:19],\n )\n self.assertEqual(i.Date(), i.EffectiveDate())\n \n@@ -714,67 +671,42 @@ def test_item_dublincore_datetime(self):\n from DateTime import DateTime\n \n import plone.dexterity\n- datetime_patcher = patch.object(plone.dexterity.content, \'DateTime\')\n+\n+ datetime_patcher = patch.object(plone.dexterity.content, "DateTime")\n mocked_datetime = datetime_patcher.start()\n mocked_datetime.return_value = DateTime(2014, 6, 1)\n self.addCleanup(datetime_patcher.stop)\n i = Item(\n title=u"Emperor Penguin",\n- description=u\'One of the most magnificent birds.\',\n- subject=u\'Penguins\',\n- contributors=u\'admin\',\n- effective_date=datetime(\n- 2010, 8, 20, 12, 59, 59, 0, timezone(\'US/Eastern\')),\n- expiration_date=datetime(\n- 2013, 7, 9, 12, 59, 59, 0, timezone(\'US/Eastern\')),\n- format=\'text/plain\',\n- language=\'de\',\n- rights=\'CC\',\n+ description=u"One of the most magnificent birds.",\n+ subject=u"Penguins",\n+ contributors=u"admin",\n+ effective_date=datetime(2010, 8, 20, 12, 59, 59, 0, timezone("US/Eastern")),\n+ expiration_date=datetime(2013, 7, 9, 12, 59, 59, 0, timezone("US/Eastern")),\n+ format="text/plain",\n+ language="de",\n+ rights="CC",\n )\n \n- summer_timezone = DateTime(\'2010/08/20\').timezone()\n- self.assertEqual(\n- i.effective_date,\n- DateTime(\'2010/08/20 12:59:59 US/Eastern\')\n- )\n+ summer_timezone = DateTime("2010/08/20").timezone()\n+ self.assertEqual(i.effective_date, DateTime("2010/08/20 12:59:59 US/Eastern"))\n self.assertEqual(\n i.EffectiveDate(zone=summer_timezone),\n- DateTime(\n- \'2010/08/20 12:59:59 US/Eastern\'\n- ).toZone(\n- summer_timezone\n- ).ISO()\n- )\n- self.assertEqual(\n- i.effective(),\n- DateTime(\'2010/08/20 12:59:59 US/Eastern\')\n- )\n- self.assertEqual(\n- i.expiration_date,\n- DateTime(\'07/09/2013 12:59:59 US/Eastern\')\n+ DateTime("2010/08/20 12:59:59 US/Eastern").toZone(summer_timezone).ISO(),\n )\n+ self.assertEqual(i.effective(), DateTime("2010/08/20 12:59:59 US/Eastern"))\n+ self.assertEqual(i.expiration_date, DateTime("07/09/2013 12:59:59 US/Eastern"))\n self.assertEqual(\n i.ExpirationDate(zone=summer_timezone),\n- DateTime(\n- \'2013-07-09 12:59:59 US/Eastern\'\n- ).toZone(\n- summer_timezone\n- ).ISO()\n- )\n- self.assertEqual(\n- i.expires(),\n- DateTime(\'2013/07/09 12:59:59 US/Eastern\')\n+ DateTime("2013-07-09 12:59:59 US/Eastern").toZone(summer_timezone).ISO(),\n )\n+ self.assertEqual(i.expires(), DateTime("2013/07/09 12:59:59 US/Eastern"))\n self.assertEqual(i.creation_date, i.created())\n- self.assertEqual(\n- i.CreationDate(zone=summer_timezone),\n- i.creation_date.ISO()\n- )\n+ self.assertEqual(i.CreationDate(zone=summer_timezone), i.creation_date.ISO())\n self.assertEqual(i.modification_date, i.creation_date)\n self.assertEqual(i.modification_date, i.modified())\n self.assertEqual(\n- i.ModificationDate(zone=summer_timezone),\n- i.modification_date.ISO()\n+ i.ModificationDate(zone=summer_timezone), i.modification_date.ISO()\n )\n self.assertEqual(i.Date(), i.EffectiveDate())\n \n@@ -783,6 +715,7 @@ def test_item_notifyModified(self):\n \n def mock_addCreator():\n mock_addCreator.called = True\n+\n i.addCreator = mock_addCreator\n \n i.setModificationDate(DateTime(0))\n@@ -794,10 +727,10 @@ def mock_addCreator():\n \n def test_item_addCreator(self):\n i = Item()\n- i.addCreator(u\'harvey\')\n- self.assertEqual(i.creators, (u\'harvey\',))\n- self.assertEqual(i.listCreators(), (u\'harvey\',))\n- self.assertEqual(i.Creator(), \'harvey\')\n+ i.addCreator(u"harvey")\n+ self.assertEqual(i.creators, (u"harvey",))\n+ self.assertEqual(i.listCreators(), (u"harvey",))\n+ self.assertEqual(i.Creator(), "harvey")\n \n def test_item_Type(self):\n i = Item()\n@@ -805,11 +738,13 @@ def test_item_Type(self):\n def mock_getTypeInfo():\n class TypeInfo(object):\n def Title(self):\n- return \'Foo\'\n+ return "Foo"\n+\n return TypeInfo()\n+\n i.getTypeInfo = mock_getTypeInfo\n \n- self.assertEqual(i.Type(), \'Foo\')\n+ self.assertEqual(i.Type(), "Foo")\n \n def test_item_init_nondc_kwargs(self):\n i = Item(foo="bar")\n@@ -817,11 +752,8 @@ def test_item_init_nondc_kwargs(self):\n \n def test_container_init_dublincore(self):\n from DateTime.DateTime import DateTime\n- c = Container(\n- title=u"Test title",\n- language="en",\n- effective_date="2010-08-20"\n- )\n+\n+ c = Container(title=u"Test title", language="en", effective_date="2010-08-20")\n self.assertEqual(c.title, u"Test title")\n self.assertEqual(c.language, "en")\n self.assertTrue(isinstance(c.effective_date, DateTime))\n@@ -857,9 +789,9 @@ def test_Title_converts_to_utf8(self):\n \n def test_Title_handles_None(self):\n i = Item(title=None)\n- self.assertEqual(\'\', i.Title())\n+ self.assertEqual("", i.Title())\n c = Container(title=None)\n- self.assertEqual(\'\', c.Title())\n+ self.assertEqual("", c.Title())\n \n def test_Creator_converts_to_utf8(self):\n i = Item()\n@@ -874,9 +806,9 @@ def test_Creator_converts_to_utf8(self):\n \n def test_Creator_handles_None(self):\n i = Item(creators=None)\n- self.assertEqual(\'\', i.Creator())\n+ self.assertEqual("", i.Creator())\n c = Container(creators=None)\n- self.assertEqual(\'\', c.Creator())\n+ self.assertEqual("", c.Creator())\n \n def test_Description_converts_to_utf8(self):\n i = Item()\n@@ -904,14 +836,14 @@ def test_setDescription_converts_to_unicode(self):\n \n def test_Description_handles_None(self):\n i = Item(description=None)\n- self.assertEqual(\'\', i.Description())\n+ self.assertEqual("", i.Description())\n c = Container(description=None)\n- self.assertEqual(\'\', c.Description())\n+ self.assertEqual("", c.Description())\n \n def test_Description_removes_newlines(self):\n i = Item()\n- i.description = u\'foo\\r\\nbar\\nbaz\\r\'\n- self.assertEqual(\'foo bar baz \', i.Description())\n+ i.description = u"foo\\r\\nbar\\nbaz\\r"\n+ self.assertEqual("foo bar baz ", i.Description())\n \n def test_Subject_converts_to_utf8(self):\n i = Item()\n@@ -960,16 +892,16 @@ def register(self, obj):\n pass\n \n # Dummy instances\n- foo = Item(id=u\'foo\')\n- foo.portal_type = \'testtype\'\n+ foo = Item(id=u"foo")\n+ foo.portal_type = "testtype"\n foo._p_jar = FauxDataManager()\n \n- bar = Item(id=u\'bar\')\n- bar.portal_type = \'testtype\'\n+ bar = Item(id=u"bar")\n+ bar.portal_type = "testtype"\n bar._p_jar = FauxDataManager()\n \n- baz = Container(id=u\'baz\')\n- baz.portal_type = \'testtype\'\n+ baz = Container(id=u"baz")\n+ baz.portal_type = "testtype"\n baz._p_jar = FauxDataManager()\n \n # Dummy schema\n@@ -995,30 +927,30 @@ class ISchema(Interface):\n def test_container_manage_delObjects(self):\n # OFS does not check the delete permission for each object being\n # deleted. We want to.\n- item = Item(id=\'test\')\n- container = Container(id=\'testcontainer\')\n- container[\'test\'] = item\n+ item = Item(id="test")\n+ container = Container(id="testcontainer")\n+ container["test"] = item\n # self.layer[\'portal\'][\'testcontainer\'] = container\n from zExceptions import Unauthorized\n- self.assertRaises(Unauthorized, container.manage_delObjects, [\'test\'])\n+\n+ self.assertRaises(Unauthorized, container.manage_delObjects, ["test"])\n \n # Now permit it and try again.\n from Products.CMFCore.permissions import DeleteObjects\n+\n # in order to use manage_permissions the permission has to be defined\n # somewhere in the mro\n # since webdav is no longer part here, where it was defined in ZServer.\n # lets add it explicit here.\n perms_before = item.__class__.__ac_permissions__\n item.__class__.__ac_permissions__ = ((DeleteObjects, ()),)\n- item.manage_permission(DeleteObjects, (\'Anonymous\',))\n- container.manage_delObjects([\'test\'])\n- self.assertFalse(\'test\' in container)\n+ item.manage_permission(DeleteObjects, ("Anonymous",))\n+ container.manage_delObjects(["test"])\n+ self.assertFalse("test" in container)\n item.__class__.__ac_permissions__ = perms_before\n \n def test_iconstraintypes_adapter(self):\n-\n class DummyConstrainTypes(object):\n-\n def __init__(self, context):\n self.context = context\n \n@@ -1026,8 +958,7 @@ def allowedContentTypes(self):\n fti = getUtility(IDexterityFTI, name=u"testtype")\n return [fti]\n \n- self.mock_adapter(\n- DummyConstrainTypes, IConstrainTypes, (IDexterityContainer, ))\n+ self.mock_adapter(DummyConstrainTypes, IConstrainTypes, (IDexterityContainer,))\n \n # FTI mock\n fti_mock = Mock(wraps=DexterityFTI(u"testtype"))\n@@ -1037,75 +968,69 @@ def allowedContentTypes(self):\n \n self.assertEqual(folder.allowedContentTypes(), [fti_mock])\n self.assertRaises(\n- ValueError,\n- folder.invokeFactory,\n- u"disallowed_type",\n- id="test"\n+ ValueError, folder.invokeFactory, u"disallowed_type", id="test"\n )\n \n def test_verifyObjectPaste_paste_without_portal_type(self):\n- original_container = Container(id=\'parent\')\n- original_container.manage_permission(\'View\', (\'Anonymous\',))\n- content = Item(id=\'test\')\n- content.__factory_meta_type__ = \'document\'\n- container = Container(id=\'container\')\n- container.all_meta_types = [{\'name\': \'document\',\n- \'action\': None,\n- \'permission\': \'View\'}]\n- container.manage_permission(\'View\', (\'Anonymous\',))\n- container[\'test\'] = content\n- content = container[\'test\']\n+ original_container = Container(id="parent")\n+ original_container.manage_permission("View", ("Anonymous",))\n+ content = Item(id="test")\n+ content.__factory_meta_type__ = "document"\n+ container = Container(id="container")\n+ container.all_meta_types = [\n+ {"name": "document", "action": None, "permission": "View"}\n+ ]\n+ container.manage_permission("View", ("Anonymous",))\n+ container["test"] = content\n+ content = container["test"]\n container._verifyObjectPaste(content, True)\n \n def test_verifyObjectPaste_fti_does_not_allow_content(self):\n from Products.CMFCore.interfaces import ITypeInformation\n- original_container = Container(id=\'parent\')\n- original_container.manage_permission(\'View\', (\'Anonymous\',))\n- content = Item(id=\'test\')\n- content.__factory_meta_type__ = \'document\'\n- content.portal_type = \'document\'\n- container = Container(id=\'container\')\n- container.all_meta_types = [{\'name\': \'document\',\n- \'action\': None,\n- \'permission\': \'View\'}]\n- container.manage_permission(\'View\', (\'Anonymous\',))\n- container[\'test\'] = content\n- content = container[\'test\']\n+\n+ original_container = Container(id="parent")\n+ original_container.manage_permission("View", ("Anonymous",))\n+ content = Item(id="test")\n+ content.__factory_meta_type__ = "document"\n+ content.portal_type = "document"\n+ container = Container(id="container")\n+ container.all_meta_types = [\n+ {"name": "document", "action": None, "permission": "View"}\n+ ]\n+ container.manage_permission("View", ("Anonymous",))\n+ container["test"] = content\n+ content = container["test"]\n fti_mock = Mock()\n fti_mock.isConstructionAllowed = Mock(return_value=False)\n- self.mock_utility(fti_mock, ITypeInformation, name=\'document\')\n+ self.mock_utility(fti_mock, ITypeInformation, name="document")\n mock_pt = Mock()\n mock_pt.getTypeInfo = Mock(return_value=None)\n- self.mock_tool(mock_pt, \'portal_types\')\n+ self.mock_tool(mock_pt, "portal_types")\n self.mock_utility(mock_pt, ITypesTool)\n \n- self.assertRaises(\n- ValueError,\n- container._verifyObjectPaste,\n- content,\n- True\n- )\n+ self.assertRaises(ValueError, container._verifyObjectPaste, content, True)\n \n def test_verifyObjectPaste_fti_does_allow_content(self):\n from Products.CMFCore.interfaces import ITypeInformation\n- original_container = Container(id=\'parent\')\n- original_container.manage_permission(\'View\', (\'Anonymous\',))\n- content = Item(id=\'test\')\n- content.__factory_meta_type__ = \'document\'\n- content.portal_type = \'document\'\n- container = Container(id=\'container\')\n- container.all_meta_types = [{\'name\': \'document\',\n- \'action\': None,\n- \'permission\': \'View\'}]\n- container.manage_permission(\'View\', (\'Anonymous\',))\n- container[\'test\'] = content\n- content = container[\'test\']\n+\n+ original_container = Container(id="parent")\n+ original_container.manage_permission("View", ("Anonymous",))\n+ content = Item(id="test")\n+ content.__factory_meta_type__ = "document"\n+ content.portal_type = "document"\n+ container = Container(id="container")\n+ container.all_meta_types = [\n+ {"name": "document", "action": None, "permission": "View"}\n+ ]\n+ container.manage_permission("View", ("Anonymous",))\n+ container["test"] = content\n+ content = container["test"]\n mock_fti = Mock()\n mock_fti.isConstructionAllowed = Mock(return_value=True)\n- self.mock_utility(mock_fti, ITypeInformation, name=\'document\')\n+ self.mock_utility(mock_fti, ITypeInformation, name="document")\n mock_pt = Mock()\n mock_pt.getTypeInfo = Mock(return_value=None)\n- self.mock_tool(mock_pt, \'portal_types\')\n+ self.mock_tool(mock_pt, "portal_types")\n self.mock_utility(mock_pt, ITypesTool)\n \n container._verifyObjectPaste(content, True)\n@@ -1120,31 +1045,26 @@ class ITest(Interface):\n \n class ITestBehavior(Interface):\n field2 = zope.schema.TextLine()\n+\n alsoProvides(ITestBehavior, IFormFieldProvider)\n \n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n- fti_mock.behaviors = [\'test_behavior\']\n+ fti_mock.behaviors = ["test_behavior"]\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n behavior_reg = BehaviorRegistration(\n- u"Test Behavior",\n- "",\n- ITestBehavior,\n- ITestBehavior,\n- None\n+ u"Test Behavior", "", ITestBehavior, ITestBehavior, None\n )\n self.mock_utility(behavior_reg, IBehavior, name="test_behavior")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n- item.field1 = SizedValue(\'1\')\n- item.field2 = SizedValue(\'22\')\n+ item = Item("item")\n+ item.portal_type = "testtype"\n+ item.field1 = SizedValue("1")\n+ item.field2 = SizedValue("22")\n \n self.assertEqual(3, item.getSize())\ndiff --git a/plone/dexterity/tests/test_content_integration.py b/plone/dexterity/tests/test_content_integration.py\nindex d2cb8f3..9291798 100644\n--- a/plone/dexterity/tests/test_content_integration.py\n+++ b/plone/dexterity/tests/test_content_integration.py\n@@ -14,13 +14,13 @@ class TestUUIDIntegration(unittest.TestCase):\n layer = UNIT_TESTING\n \n def setUp(self):\n- import zope.component.testing\n- import plone.uuid\n-\n from zope.configuration import xmlconfig\n \n+ import plone.uuid\n+ import zope.component.testing\n+\n zope.component.testing.setUp()\n- xmlconfig.file(\'configure.zcml\', plone.uuid)\n+ xmlconfig.file("configure.zcml", plone.uuid)\n \n def test_uuid_assigned_on_creation(self):\n from plone.dexterity.content import Item\ndiff --git a/plone/dexterity/tests/test_exportimport.py b/plone/dexterity/tests/test_exportimport.py\nindex 0194037..97cd983 100644\n--- a/plone/dexterity/tests/test_exportimport.py\n+++ b/plone/dexterity/tests/test_exportimport.py\n@@ -3,43 +3,41 @@\n \n \n class ExportImportTests(unittest.TestCase):\n-\n def test_export(self):\n # Make sure our exporter delegates to manage_FTPget()\n from plone.dexterity.content import Item\n- from plone.dexterity.exportimport import \\\n- DexterityContentExporterImporter\n+ from plone.dexterity.exportimport import DexterityContentExporterImporter\n from Products.GenericSetup.tests.common import DummyExportContext\n \n class DummyItem(Item):\n def manage_FTPget(self):\n- return \'title: Foo\'\n- item = DummyItem(\'test\')\n+ return "title: Foo"\n+\n+ item = DummyItem("test")\n \n export_context = DummyExportContext(None)\n exporter = DexterityContentExporterImporter(item)\n exporter.export(export_context, subdir=None, root=True)\n \n self.assertEqual(\n- export_context._wrote[-1],\n- (\'.data\', \'title: Foo\', \'text/plain\')\n+ export_context._wrote[-1], (".data", "title: Foo", "text/plain")\n )\n \n def test_import(self):\n # Make sure our importer delegates to PUT()\n from plone.dexterity.content import Item\n- from plone.dexterity.exportimport import \\\n- DexterityContentExporterImporter\n+ from plone.dexterity.exportimport import DexterityContentExporterImporter\n from Products.GenericSetup.tests.common import DummyImportContext\n \n class DummyItem(Item):\n def PUT(self, request, response):\n- self.title = \'Foo\'\n- item = DummyItem(\'test\')\n+ self.title = "Foo"\n+\n+ item = DummyItem("test")\n \n import_context = DummyImportContext(None)\n- import_context._files[\'.data\'] = b\'title: Foo\'\n+ import_context._files[".data"] = b"title: Foo"\n importer = DexterityContentExporterImporter(item)\n importer.import_(import_context, None, root=True)\n \n- self.assertEqual(\'Foo\', item.Title())\n+ self.assertEqual("Foo", item.Title())\ndiff --git a/plone/dexterity/tests/test_factory.py b/plone/dexterity/tests/test_factory.py\nindex f8621b2..df35690 100644\n--- a/plone/dexterity/tests/test_factory.py\n+++ b/plone/dexterity/tests/test_factory.py\n@@ -11,21 +11,21 @@\n except ImportError:\n from mock import Mock\n \n+\n class IDummy(Interface):\n pass\n \n \n class TestFactory(MockTestCase):\n-\n def test_title(self):\n- fti_mock = Mock(spec=DexterityFTI, title=\'Mock type\')\n+ fti_mock = Mock(spec=DexterityFTI, title="Mock type")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual("Mock type", factory.title)\n \n def test_description(self):\n- fti_mock = Mock(spec=DexterityFTI, description=\'Mock type description\')\n+ fti_mock = Mock(spec=DexterityFTI, description="Mock type description")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n factory = DexterityFactory(portal_type=u"testtype")\n@@ -52,17 +52,18 @@ def test_get_interfaces(self):\n def test_create_with_schema_already_provided_and_portal_type_set(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=u\'testtype\')\n+ obj_mock = Mock(portal_type=u"testtype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n- fti_mock = Mock(spec=DexterityFTI, klass=\'my.mocked.ContentTypeClass\')\n+ fti_mock = Mock(spec=DexterityFTI, klass="my.mocked.ContentTypeClass")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n factory = DexterityFactory(portal_type=u"testtype")\n@@ -78,6 +79,7 @@ def test_create_sets_portal_type_if_not_set(self):\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -87,18 +89,19 @@ def test_create_sets_portal_type_if_not_set(self):\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual(obj_mock, factory())\n- self.assertEqual(obj_mock.portal_type, u\'testtype\')\n+ self.assertEqual(obj_mock.portal_type, u"testtype")\n \n def test_create_sets_portal_type_if_wrong(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=\'othertype\')\n+ obj_mock = Mock(portal_type="othertype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -108,18 +111,19 @@ def test_create_sets_portal_type_if_wrong(self):\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual(obj_mock, factory())\n- self.assertEqual(obj_mock.portal_type, u\'testtype\')\n+ self.assertEqual(obj_mock.portal_type, u"testtype")\n \n def test_create_initialises_schema_if_not_provided(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=u\'testtype\')\n+ obj_mock = Mock(portal_type=u"testtype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -133,13 +137,14 @@ def test_create_initialises_schema_if_not_provided(self):\n def test_factory_passes_args_and_kwargs(self):\n \n # Object returned by class\n- obj_mock = Mock(portal_type=u\'testtype\')\n+ obj_mock = Mock(portal_type=u"testtype")\n \n # Class set by factory\n klass_mock = Mock(return_value=obj_mock)\n \n # Resolver\n from plone.dexterity.utils import resolveDottedName\n+\n self.patch_global(resolveDottedName, return_value=klass_mock)\n \n # FTI\n@@ -149,4 +154,4 @@ def test_factory_passes_args_and_kwargs(self):\n \n factory = DexterityFactory(portal_type=u"testtype")\n self.assertEqual(obj_mock, factory(u"id", title=u"title"))\n- klass_mock.assert_called_once_with(u\'id\', title=u\'title\')\n+ klass_mock.assert_called_once_with(u"id", title=u"title")\ndiff --git a/plone/dexterity/tests/test_fti.py b/plone/dexterity/tests/test_fti.py\nindex 018587f..da1e61f 100644\n--- a/plone/dexterity/tests/test_fti.py\n+++ b/plone/dexterity/tests/test_fti.py\n@@ -1,7 +1,6 @@\n # -*- coding: utf-8 -*-\n from .case import MockTestCase\n from plone.dexterity import utils\n-from plone.dexterity.schema import portalTypeToSchemaName\n from plone.dexterity.factory import DexterityFactory\n from plone.dexterity.fti import DexterityFTI\n from plone.dexterity.fti import DexterityFTIModificationDescription\n@@ -11,6 +10,7 @@\n from plone.dexterity.fti import ftiRenamed\n from plone.dexterity.interfaces import IDexterityFTI\n from plone.dexterity.schema import DexteritySchemaPolicy\n+from plone.dexterity.schema import portalTypeToSchemaName\n from plone.dexterity.tests.schemata import ITestSchema\n from plone.supermodel.model import Model\n from Products.CMFCore.interfaces import ISiteRoot\n@@ -52,7 +52,6 @@ class ITestInterface(Interface):\n \n \n class TestFTI(MockTestCase):\n-\n def test_factory_name_is_fti_id(self):\n fti = DexterityFTI(u"testtype")\n self.assertEqual(u"testtype", fti.getId())\n@@ -76,7 +75,7 @@ def test_lookupSchema_with_dynamic_schema(self):\n fti = DexterityFTI(u"testtype")\n fti.schema = None # use dynamic schema\n \n- portal = self.create_dummy(getPhysicalPath=lambda: (\'\', \'site\'))\n+ portal = self.create_dummy(getPhysicalPath=lambda: ("", "site"))\n self.mock_utility(portal, ISiteRoot)\n \n schemaName = portalTypeToSchemaName(fti.getId())\n@@ -88,12 +87,12 @@ def test_lookupSchema_with_dynamic_schema(self):\n delattr(plone.dexterity.schema.generated, schemaName)\n \n def test_lookupSchema_with_nonexistant_schema(self):\n- """ Tests the case where a dexterity type is not removed cleanly\n+ """Tests the case where a dexterity type is not removed cleanly\n from the fti, but the code has been removed.\n """\n fti = DexterityFTI(u"testtype")\n- fti.schema = \'model.wont.be.imported\'\n- portal = self.create_dummy(getPhysicalPath=lambda: (\'\', \'site\'))\n+ fti.schema = "model.wont.be.imported"\n+ portal = self.create_dummy(getPhysicalPath=lambda: ("", "site"))\n self.mock_utility(portal, ISiteRoot)\n schemaName = portalTypeToSchemaName(fti.getId())\n setattr(plone.dexterity.schema.generated, schemaName, ITestSchema)\n@@ -109,6 +108,7 @@ def test_lookupModel_from_string(self):\n model_dummy = Model()\n \n from plone.supermodel import loadString\n+\n self.patch_global(loadString, return_value=model_dummy)\n \n model = fti.lookupModel()\n@@ -124,25 +124,27 @@ def test_lookupModel_from_file_with_package(self):\n model_dummy = Model()\n \n import plone.dexterity.tests\n+\n abs_file = os.path.join(\n- os.path.split(plone.dexterity.tests.__file__)[0],\n- "test.xml"\n+ os.path.split(plone.dexterity.tests.__file__)[0], "test.xml"\n )\n \n from plone.supermodel import loadFile\n+\n loadFile_mock = self.patch_global(loadFile, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n loadFile_mock.assert_called_once_with(\n- abs_file, reload=True, policy=u"dexterity")\n+ abs_file, reload=True, policy=u"dexterity"\n+ )\n \n def test_lookupModel_from_file_with_absolute_path(self):\n \n import plone.dexterity.tests\n+\n abs_file = os.path.join(\n- os.path.split(plone.dexterity.tests.__file__)[0],\n- "test.xml"\n+ os.path.split(plone.dexterity.tests.__file__)[0], "test.xml"\n )\n \n fti = DexterityFTI(u"testtype")\n@@ -153,12 +155,14 @@ def test_lookupModel_from_file_with_absolute_path(self):\n model_dummy = Model()\n \n from plone.supermodel import loadFile\n+\n loadFile_mock = self.patch_global(loadFile, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n loadFile_mock.assert_called_once_with(\n- abs_file, reload=True, policy=u"dexterity")\n+ abs_file, reload=True, policy=u"dexterity"\n+ )\n \n def test_lookupModel_from_file_with_win32_absolute_path(self):\n \n@@ -169,17 +173,21 @@ def test_lookupModel_from_file_with_win32_absolute_path(self):\n \n model_dummy = Model()\n \n- from os.path import isabs, isfile\n+ from os.path import isabs\n+ from os.path import isfile\n+\n self.patch_global(isabs, return_value=True)\n self.patch_global(isfile, return_value=True)\n \n from plone.supermodel import loadFile\n+\n loadFile_mock = self.patch_global(loadFile, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n loadFile_mock.assert_called_once_with(\n- fti.model_file, reload=True, policy=u"dexterity")\n+ fti.model_file, reload=True, policy=u"dexterity"\n+ )\n \n def test_lookupModel_with_schema_only(self):\n fti = DexterityFTI(u"testtype")\n@@ -201,14 +209,13 @@ def test_lookupModel_from_string_with_schema(self):\n model_dummy = Model()\n \n from plone.supermodel import loadString\n- loadString_mock = self.patch_global(\n- loadString, return_value=model_dummy)\n+\n+ loadString_mock = self.patch_global(loadString, return_value=model_dummy)\n \n model = fti.lookupModel()\n self.assertIs(model_dummy, model)\n self.assertIs(ITestSchema, fti.lookupSchema())\n- loadString_mock.assert_called_once_with(\n- fti.model_source, policy=u\'dexterity\')\n+ loadString_mock.assert_called_once_with(fti.model_source, policy=u"dexterity")\n \n def test_lookupModel_failure(self):\n fti = DexterityFTI(u"testtype")\n@@ -225,16 +232,17 @@ def test_fires_modified_event_on_update_property_if_changed(self):\n fti.global_allow = False\n \n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n- fti._updateProperty(\'title\', "New title") # fires event caught above\n- fti._updateProperty(\'allow_discussion\', False) # does not fire\n+ fti._updateProperty("title", "New title") # fires event caught above\n+ fti._updateProperty("allow_discussion", False) # does not fire\n \n event = notify_mock.call_args[0][0]\n self.assertTrue(IObjectModifiedEvent.providedBy(event))\n self.assertEqual(len(event.descriptions), 1)\n- self.assertEqual(event.descriptions[0].attribute, \'title\')\n- self.assertEqual(event.descriptions[0].oldValue, \'Old title\')\n+ self.assertEqual(event.descriptions[0].attribute, "title")\n+ self.assertEqual(event.descriptions[0].oldValue, "Old title")\n \n def test_fires_modified_event_on_change_props_per_changed_property(self):\n fti = DexterityFTI(u"testtype")\n@@ -243,12 +251,11 @@ def test_fires_modified_event_on_change_props_per_changed_property(self):\n fti.global_allow = True\n \n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n fti.manage_changeProperties(\n- title="New title",\n- allow_discussion=False,\n- global_allow=False\n+ title="New title", allow_discussion=False, global_allow=False\n )\n \n self.assertEqual(len(notify_mock.call_args_list), 2)\n@@ -259,24 +266,21 @@ def test_checks_permission_in_is_construction_allowed_true(self):\n container_dummy = self.create_dummy()\n \n permission_dummy = self.create_dummy()\n- permission_dummy.id = \'demo.Permission\'\n- permission_dummy.title = \'Some add permission\'\n+ permission_dummy.id = "demo.Permission"\n+ permission_dummy.title = "Some add permission"\n \n- self.mock_utility(\n- permission_dummy,\n- IPermission,\n- name=u"demo.Permission"\n- )\n+ self.mock_utility(permission_dummy, IPermission, name=u"demo.Permission")\n \n security_manager_mock = Mock()\n security_manager_mock.checkPermission = Mock(return_value=True)\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n self.assertEqual(True, fti.isConstructionAllowed(container_dummy))\n security_manager_mock.checkPermission.assert_called_once_with(\n- \'Some add permission\', container_dummy)\n+ "Some add permission", container_dummy\n+ )\n \n def test_checks_permission_in_is_construction_allowed_false(self):\n fti = DexterityFTI(u"testtype")\n@@ -284,28 +288,25 @@ def test_checks_permission_in_is_construction_allowed_false(self):\n container_dummy = self.create_dummy()\n \n permission_dummy = self.create_dummy()\n- permission_dummy.id = \'demo.Permission\'\n- permission_dummy.title = \'Some add permission\'\n+ permission_dummy.id = "demo.Permission"\n+ permission_dummy.title = "Some add permission"\n \n- self.mock_utility(\n- permission_dummy,\n- IPermission,\n- name=u"demo.Permission"\n- )\n+ self.mock_utility(permission_dummy, IPermission, name=u"demo.Permission")\n \n security_manager_mock = Mock()\n security_manager_mock.checkPermission = Mock(return_value=False)\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n self.assertEqual(False, fti.isConstructionAllowed(container_dummy))\n security_manager_mock.checkPermission.assert_called_once_with(\n- \'Some add permission\', container_dummy)\n+ "Some add permission", container_dummy\n+ )\n \n def test_no_permission_utility_means_no_construction(self):\n fti = DexterityFTI(u"testtype")\n- fti.add_permission = \'demo.Permission\' # not an IPermission utility\n+ fti.add_permission = "demo.Permission" # not an IPermission utility\n container_dummy = self.create_dummy()\n self.assertEqual(False, fti.isConstructionAllowed(container_dummy))\n \n@@ -317,85 +318,76 @@ def test_no_permission_means_no_construction(self):\n \n def test_add_view_url_set_on_creation(self):\n fti = DexterityFTI(u"testtype")\n- self.assertEqual(\n- \'string:${folder_url}/++add++testtype\',\n- fti.add_view_expr\n- )\n+ self.assertEqual("string:${folder_url}/++add++testtype", fti.add_view_expr)\n \n def test_factory_set_on_creation(self):\n fti = DexterityFTI(u"testtype")\n- self.assertEqual(\'testtype\', fti.factory)\n+ self.assertEqual("testtype", fti.factory)\n \n def test_addview_and_factory_not_overridden_on_creation(self):\n fti = DexterityFTI(\n u"testtype",\n add_view_expr="string:${folder_url}/@@my-addview",\n- factory="my.factory"\n+ factory="my.factory",\n )\n- self.assertEqual(\n- \'string:${folder_url}/@@my-addview\',\n- fti.add_view_expr\n- )\n- self.assertEqual(\'my.factory\', fti.factory)\n+ self.assertEqual("string:${folder_url}/@@my-addview", fti.add_view_expr)\n+ self.assertEqual("my.factory", fti.factory)\n \n def test_meta_type(self):\n fti = DexterityFTI(\n- u"testtype",\n- klass="plone.dexterity.tests.test_fti.TestClass"\n+ u"testtype", klass="plone.dexterity.tests.test_fti.TestClass"\n )\n self.assertEqual(TestClass.meta_type, fti.Metatype())\n \n def test_meta_type_change_class(self):\n fti = DexterityFTI(\n- u"testtype",\n- klass="plone.dexterity.tests.test_fti.TestClass"\n- )\n- fti._updateProperty(\n- \'klass\',\n- "plone.dexterity.tests.test_fti.TestClass2"\n+ u"testtype", klass="plone.dexterity.tests.test_fti.TestClass"\n )\n+ fti._updateProperty("klass", "plone.dexterity.tests.test_fti.TestClass2")\n self.assertEqual(TestClass2.meta_type, fti.Metatype())\n \n def test_title_i18n(self):\n- fti = DexterityFTI(u\'testtype\', title=b\'t\\xc3\\xa9st\')\n+ fti = DexterityFTI(u"testtype", title=b"t\\xc3\\xa9st")\n \n # with no i18n domain, we get the UTF8-encoded title\n- self.assertEqual(b\'t\\xc3\\xa9st\'.decode(\'utf8\'), fti.Title())\n+ self.assertEqual(b"t\\xc3\\xa9st".decode("utf8"), fti.Title())\n \n # with an i18n domain, we get a Message\n- fti.i18n_domain = \'test\'\n+ fti.i18n_domain = "test"\n msgid = fti.Title()\n- self.assertEqual(u\'t\\xe9st\', msgid)\n- self.assertEqual(\'test\', msgid.domain)\n+ self.assertEqual(u"t\\xe9st", msgid)\n+ self.assertEqual("test", msgid.domain)\n \n def test_description_i18n(self):\n- fti = DexterityFTI(u\'testtype\', description=b\'t\\xc3\\xa9st\')\n+ fti = DexterityFTI(u"testtype", description=b"t\\xc3\\xa9st")\n \n # with no i18n domain, we get the UTF8-encoded title\n- self.assertEqual(b\'t\\xc3\\xa9st\'.decode(\'utf8\'), fti.Description())\n+ self.assertEqual(b"t\\xc3\\xa9st".decode("utf8"), fti.Description())\n \n # with an i18n domain, we get a Message\n- fti.i18n_domain = \'test\'\n+ fti.i18n_domain = "test"\n msgid = fti.Description()\n- self.assertEqual(u\'t\\xe9st\', msgid)\n- self.assertEqual(\'test\', msgid.domain)\n+ self.assertEqual(u"t\\xe9st", msgid)\n+ self.assertEqual("test", msgid.domain)\n \n def test_lookupModel_without_schema_policy(self):\n gsm = getGlobalSiteManager()\n gsm.registerUtility(\n DexteritySchemaPolicy(),\n plone.supermodel.interfaces.ISchemaPolicy,\n- name=u"dexterity"\n+ name=u"dexterity",\n )\n \n fti = DexterityFTI(u"testtype")\n fti.schema = None\n- fti.model_source = \'\'\n+ fti.model_source = (\n+ \'\'\n+ )\n fti.model_file = None\n \n model = fti.lookupModel()\n- self.assertEqual(False, ITestInterface in model.schemata[\'\'].__bases__)\n+ self.assertEqual(False, ITestInterface in model.schemata[""].__bases__)\n \n def test_lookupModel_with_schema_policy(self):\n class TestSchemaPolicy(DexteritySchemaPolicy):\n@@ -405,20 +397,20 @@ def bases(self, schemaName, tree):\n gsm = getGlobalSiteManager()\n policy = TestSchemaPolicy()\n gsm.registerUtility(\n- policy,\n- plone.supermodel.interfaces.ISchemaPolicy,\n- name=u"test"\n+ policy, plone.supermodel.interfaces.ISchemaPolicy, name=u"test"\n )\n \n fti = DexterityFTI(u"testtype")\n fti.schema = None\n- fti.model_source = \'\'\n+ fti.model_source = (\n+ \'\'\n+ )\n fti.model_file = None\n fti.schema_policy = u"test"\n \n model = fti.lookupModel()\n- self.assertEqual(True, ITestInterface in model.schemata[\'\'].__bases__)\n+ self.assertEqual(True, ITestInterface in model.schemata[""].__bases__)\n \n \n class TestFTIEvents(MockTestCase):\n@@ -438,32 +430,29 @@ def test_components_registered_on_add(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId()))\n \n args1, kwargs1 = site_manager_mock.registerUtility.call_args_list[0]\n self.assertEqual(args1, (fti, IDexterityFTI, portal_type))\n- self.assertEqual(kwargs1, {\'info\': \'plone.dexterity.dynamic\'})\n+ self.assertEqual(kwargs1, {"info": "plone.dexterity.dynamic"})\n \n args2, kwargs2 = site_manager_mock.registerUtility.call_args_list[1]\n self.assertIsInstance(args2[0], DexterityFactory)\n self.assertEqual(args2[0].portal_type, portal_type)\n self.assertEqual(args2[1:], (IFactory, portal_type))\n- self.assertEqual(kwargs2, {\'info\': \'plone.dexterity.dynamic\'})\n+ self.assertEqual(kwargs2, {"info": "plone.dexterity.dynamic"})\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n- self.assertNotEqual(\n- None,\n- queryUtility(IDexterityFTI, name=portal_type)\n- )\n+ self.assertNotEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertNotEqual(None, queryUtility(IFactory, name=portal_type))\n \n def test_components_not_registered_on_add_if_exist(self):\n@@ -476,18 +465,16 @@ def test_components_not_registered_on_add_if_exist(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Register FTI utility and factory utility\n \n self.mock_utility(fti, IDexterityFTI, name=portal_type)\n- self.mock_utility(\n- DexterityFactory(portal_type),\n- IFactory,\n- name=portal_type\n- )\n+ self.mock_utility(DexterityFactory(portal_type), IFactory, name=portal_type)\n \n # We expect that all components are registered, so do not expect any\n # registrations\n@@ -506,8 +493,10 @@ def test_components_unregistered_on_delete(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # First add the components\n@@ -516,16 +505,16 @@ def test_components_unregistered_on_delete(self):\n # Then remove them again\n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n self.assertEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertEqual(None, queryUtility(IFactory, name=portal_type))\n \n- def test_components_unregistered_on_delete_does_not_error_with_no_components(self): # noqa\n+ def test_components_unregistered_on_delete_does_not_error_with_no_components(\n+ self,\n+ ): # noqa\n portal_type = u"testtype"\n fti = DexterityFTI(portal_type)\n container_dummy = self.create_dummy()\n@@ -535,8 +524,10 @@ def test_components_unregistered_on_delete_does_not_error_with_no_components(sel\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # We expect to always be able to unregister without error, even if the\n@@ -545,7 +536,8 @@ def test_components_unregistered_on_delete_does_not_error_with_no_components(sel\n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n site_manager_mock.unregisterUtility.assert_called_once_with(\n- provided=IDexterityFTI, name=portal_type)\n+ provided=IDexterityFTI, name=portal_type\n+ )\n \n def test_global_components_not_unregistered_on_delete(self):\n portal_type = u"testtype"\n@@ -557,18 +549,16 @@ def test_global_components_not_unregistered_on_delete(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Register FTI utility and factory utility\n \n self.mock_utility(fti, IDexterityFTI, name=portal_type)\n- self.mock_utility(\n- DexterityFactory(portal_type),\n- IFactory,\n- name=portal_type\n- )\n+ self.mock_utility(DexterityFactory(portal_type), IFactory, name=portal_type)\n \n # We expect to always be able to unregister without error, even if the\n # component exists. The factory is only unregistered if it was\n@@ -576,16 +566,11 @@ def test_global_components_not_unregistered_on_delete(self):\n \n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n- self.assertNotEqual(\n- None,\n- queryUtility(IDexterityFTI, name=portal_type)\n- )\n+ self.assertNotEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertNotEqual(None, queryUtility(IFactory, name=portal_type))\n \n def test_components_reregistered_on_rename(self):\n@@ -598,24 +583,19 @@ def test_components_reregistered_on_rename(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n- self.assertEqual(\n- \'string:${folder_url}/++add++testtype\',\n- fti.add_view_expr\n- )\n+ self.assertEqual("string:${folder_url}/++add++testtype", fti.add_view_expr)\n \n ftiRenamed(\n fti,\n ObjectMovedEvent(\n- fti,\n- container_dummy,\n- fti.getId(),\n- container_dummy,\n- u"newtype"\n- )\n+ fti, container_dummy, fti.getId(), container_dummy, u"newtype"\n+ ),\n )\n \n # First look for unregistration of all local components\n@@ -626,16 +606,11 @@ def test_components_reregistered_on_rename(self):\n # Then look for re-registration of global components\n self.assertEqual(site_manager_mock.registerUtility.call_count, 2)\n \n- site_dummy = self.create_dummy(\n- getSiteManager=lambda: site_manager_mock\n- )\n+ site_dummy = self.create_dummy(getSiteManager=lambda: site_manager_mock)\n setSite(site_dummy)\n setHooks()\n \n- self.assertNotEqual(\n- None,\n- queryUtility(IDexterityFTI, name=portal_type)\n- )\n+ self.assertNotEqual(None, queryUtility(IDexterityFTI, name=portal_type))\n self.assertNotEqual(None, queryUtility(IFactory, name=portal_type))\n \n def test_dynamic_schema_refreshed_on_modify_model_file(self):\n@@ -650,9 +625,7 @@ class INew(Interface):\n fti.lookupModel = Mock(return_value=model_dummy)\n self.create_dummy()\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n class IBlank1(Interface):\n@@ -666,13 +639,12 @@ class IBlank1(Interface):\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'model_file\', \'\')\n- )\n+ fti, DexterityFTIModificationDescription("model_file", "")\n+ ),\n )\n \n- self.assertTrue(\'title\' in IBlank1)\n- self.assertTrue(IBlank1[\'title\'].title == u"title")\n+ self.assertTrue("title" in IBlank1)\n+ self.assertTrue(IBlank1["title"].title == u"title")\n \n def test_dynamic_schema_refreshed_on_modify_model_source(self):\n portal_type = u"testtype"\n@@ -686,9 +658,7 @@ class INew(Interface):\n fti.lookupModel = Mock(return_value=model_dummy)\n self.create_dummy()\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n # b/c of zope.interface does not support hashing of the same class multiple times\n@@ -705,13 +675,12 @@ class IBlank2(Interface):\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'model_source\', \'\')\n- )\n+ fti, DexterityFTIModificationDescription("model_source", "")\n+ ),\n )\n \n- self.assertTrue(\'title\' in IBlank2)\n- self.assertTrue(IBlank2[\'title\'].title == u"title")\n+ self.assertTrue("title" in IBlank2)\n+ self.assertTrue(IBlank2["title"].title == u"title")\n \n def test_dynamic_schema_refreshed_on_modify_schema_policy(self):\n portal_type = u"testtype"\n@@ -730,14 +699,10 @@ def bases(self, schemaName, tree):\n gsm = getGlobalSiteManager()\n policy = TestSchemaPolicy()\n gsm.registerUtility(\n- policy,\n- plone.supermodel.interfaces.ISchemaPolicy,\n- name=u"test"\n+ policy, plone.supermodel.interfaces.ISchemaPolicy, name=u"test"\n )\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n # Set source interface\n@@ -745,7 +710,7 @@ def bases(self, schemaName, tree):\n setattr(plone.dexterity.schema.generated, schemaName, IBlank3)\n original = getattr(plone.dexterity.schema.generated, schemaName)\n self.assertNotIn(INew, original.__bases__)\n- self.assertNotIn(\'title\', original)\n+ self.assertNotIn("title", original)\n \n # Set new schema_policy\n fti.schema_policy = "test"\n@@ -754,12 +719,11 @@ def bases(self, schemaName, tree):\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'schema_policy\', \'\')\n- )\n+ fti, DexterityFTIModificationDescription("schema_policy", "")\n+ ),\n )\n updated = getattr(plone.dexterity.schema.generated, schemaName)\n- self.assertIn(\'title\', updated)\n+ self.assertIn("title", updated)\n self.assertIn(INew, updated.__bases__)\n \n def test_concrete_schema_not_refreshed_on_modify_schema(self):\n@@ -775,9 +739,7 @@ class INew(Interface):\n model_dummy = Model({u"": INew})\n fti.lookupModel = Mock(return_value=model_dummy)\n \n- site_dummy = self.create_dummy(\n- getPhysicalPath=lambda: (\'\', \'siteid\')\n- )\n+ site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid"))\n self.mock_utility(site_dummy, ISiteRoot)\n \n # Set schema to something so that hasDynamicSchema is false\n@@ -792,13 +754,10 @@ class INew(Interface):\n \n ftiModified(\n fti,\n- ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'schema\', \'\')\n- )\n+ ObjectModifiedEvent(fti, DexterityFTIModificationDescription("schema", "")),\n )\n \n- self.assertFalse(\'title\' in IBlank4)\n+ self.assertFalse("title" in IBlank4)\n \n def test_old_factory_unregistered_after_name_changed_if_dynamic(self):\n portal_type = u"testtype"\n@@ -809,34 +768,37 @@ def test_old_factory_unregistered_after_name_changed_if_dynamic(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend like we have a utility registered\n \n reg1 = self.create_dummy()\n reg1.provided = IFactory\n- reg1.name = \'old-factory\'\n- reg1.info = \'plone.dexterity.dynamic\'\n+ reg1.name = "old-factory"\n+ reg1.info = "plone.dexterity.dynamic"\n \n site_manager_mock.registeredUtilities = Mock(return_value=[reg1])\n \n- fti.factory = \'new-factory\'\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'factory\', \'old-factory\')\n- )\n+ fti, DexterityFTIModificationDescription("factory", "old-factory")\n+ ),\n )\n \n # Expect this to get removed\n site_manager_mock.unregisterUtility.assert_called_once_with(\n- provided=IFactory, name=\'old-factory\')\n+ provided=IFactory, name="old-factory"\n+ )\n # And a new one to be created with the new factory name\n self.assertEqual(\n- site_manager_mock.registerUtility.call_args[0][2], \'new-factory\')\n+ site_manager_mock.registerUtility.call_args[0][2], "new-factory"\n+ )\n \n def test_new_factory_not_registered_after_name_changed_if_exists(self):\n portal_type = u"testtype"\n@@ -847,24 +809,21 @@ def test_new_factory_not_registered_after_name_changed_if_exists(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Create a global default for the new name\n- self.mock_utility(\n- DexterityFactory(portal_type),\n- IFactory,\n- name=\'new-factory\'\n- )\n+ self.mock_utility(DexterityFactory(portal_type), IFactory, name="new-factory")\n \n- fti.factory = \'new-factory\'\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'factory\', \'old-factory\')\n- )\n+ fti, DexterityFTIModificationDescription("factory", "old-factory")\n+ ),\n )\n \n # Factory should not be registered again\n@@ -879,80 +838,82 @@ def test_old_factory_not_unregistered_if_not_created_by_dexterity(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend like we have a utility registered\n \n reg1 = self.create_dummy()\n reg1.provided = IFactory\n- reg1.name = \'old-factory\'\n+ reg1.name = "old-factory"\n reg1.info = None\n \n site_manager_mock.registeredUtilities = Mock(return_value=[reg1])\n \n- fti.factory = \'new-factory\'\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\'factory\', \'old-factory\')\n- )\n+ fti, DexterityFTIModificationDescription("factory", "old-factory")\n+ ),\n )\n \n # This should not be removed, since we didn\'t create it\n self.assertFalse(site_manager_mock.unregisterUtility.called)\n # A new one may still be created, however\n self.assertEqual(\n- site_manager_mock.registerUtility.call_args[0][2], \'new-factory\')\n+ site_manager_mock.registerUtility.call_args[0][2], "new-factory"\n+ )\n \n def test_renamed_factory_not_unregistered_if_not_unique(self):\n portal_type = u"testtype"\n- fti = DexterityFTI(portal_type, factory=\'common-factory\')\n+ fti = DexterityFTI(portal_type, factory="common-factory")\n portal_type2 = u"testtype2"\n- fti2 = DexterityFTI(portal_type2, factory=\'common-factory\')\n+ fti2 = DexterityFTI(portal_type2, factory="common-factory")\n \n # Mock the lookup of the site and the site manager at the site root\n dummy_site = self.create_dummy()\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend two FTIs are registered, both using common-factory\n- site_manager_mock.registeredUtilities = Mock(return_value=[\n- self.create_dummy(\n- provided=IFactory,\n- name=\'common-factory\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- self.create_dummy(\n- component=fti,\n- provided=IDexterityFTI,\n- name=\'testtype\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- self.create_dummy(\n- component=fti2,\n- provided=IDexterityFTI,\n- name=\'testtype2\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- ])\n-\n- fti.factory = \'new-factory\'\n+ site_manager_mock.registeredUtilities = Mock(\n+ return_value=[\n+ self.create_dummy(\n+ provided=IFactory,\n+ name="common-factory",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ self.create_dummy(\n+ component=fti,\n+ provided=IDexterityFTI,\n+ name="testtype",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ self.create_dummy(\n+ component=fti2,\n+ provided=IDexterityFTI,\n+ name="testtype2",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ ]\n+ )\n+\n+ fti.factory = "new-factory"\n ftiModified(\n fti,\n ObjectModifiedEvent(\n- fti,\n- DexterityFTIModificationDescription(\n- \'factory\',\n- \'common-factory\'\n- )\n- )\n+ fti, DexterityFTIModificationDescription("factory", "common-factory")\n+ ),\n )\n \n # We shouldn\'t remove this since fti2 still uses it\n@@ -960,13 +921,14 @@ def test_renamed_factory_not_unregistered_if_not_unique(self):\n \n # A new one may still be created, however\n self.assertEqual(\n- site_manager_mock.registerUtility.call_args[0][2], \'new-factory\')\n+ site_manager_mock.registerUtility.call_args[0][2], "new-factory"\n+ )\n \n def test_deleted_factory_not_unregistered_if_not_unique(self):\n portal_type = u"testtype"\n- fti = DexterityFTI(portal_type, factory=\'common-factory\')\n+ fti = DexterityFTI(portal_type, factory="common-factory")\n portal_type2 = u"testtype2"\n- fti2 = DexterityFTI(portal_type2, factory=\'common-factory\')\n+ fti2 = DexterityFTI(portal_type2, factory="common-factory")\n container_dummy = self.create_dummy()\n \n # Mock the lookup of the site and the site manager at the site root\n@@ -974,31 +936,35 @@ def test_deleted_factory_not_unregistered_if_not_unique(self):\n self.mock_utility(dummy_site, ISiteRoot)\n \n site_manager_mock = Mock(\n- wraps=PersistentComponents(bases=(getGlobalSiteManager(),)))\n+ wraps=PersistentComponents(bases=(getGlobalSiteManager(),))\n+ )\n from zope.component.hooks import getSiteManager\n+\n self.patch_global(getSiteManager, return_value=site_manager_mock)\n \n # Pretend two FTIs are registered, both using common-factory\n # NB: Assuming that "testtype" was already removed when this gets\n # called\n- site_manager_mock.registeredUtilities = Mock(return_value=[\n- self.create_dummy(\n- provided=IFactory,\n- name=\'common-factory\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- self.create_dummy(\n- component=fti2,\n- provided=IDexterityFTI,\n- name=\'testtype2\',\n- info=\'plone.dexterity.dynamic\'\n- ),\n- ])\n+ site_manager_mock.registeredUtilities = Mock(\n+ return_value=[\n+ self.create_dummy(\n+ provided=IFactory,\n+ name="common-factory",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ self.create_dummy(\n+ component=fti2,\n+ provided=IDexterityFTI,\n+ name="testtype2",\n+ info="plone.dexterity.dynamic",\n+ ),\n+ ]\n+ )\n \n ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId()))\n \n # We shouldn\'t remove this since fti2 still uses it\n # The type itself should be removed though\n site_manager_mock.unregisterUtility.assert_called_once_with(\n- provided=IDexterityFTI, name=u\'testtype\'\n+ provided=IDexterityFTI, name=u"testtype"\n )\ndiff --git a/plone/dexterity/tests/test_primary.py b/plone/dexterity/tests/test_primary.py\nindex e24741b..403e038 100644\n--- a/plone/dexterity/tests/test_primary.py\n+++ b/plone/dexterity/tests/test_primary.py\n@@ -15,24 +15,25 @@\n except ImportError:\n from mock import Mock\n \n+\n class PrimaryFieldInfoTestCase(MockTestCase):\n def test_primary_field_info(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n+\n+ alsoProvides(ITest["body"], IPrimaryField)\n \n fti = DexterityFTI(u"testtype")\n fti.lookupSchema = Mock(return_value=ITest)\n fti.behaviors = []\n self.mock_utility(fti, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n- item.body = u\'body text\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n+ item.body = u"body text"\n \n info = PrimaryFieldInfo(item)\n- assert info.fieldname == \'body\'\n- assert info.field == ITest[\'body\']\n- assert info.value == \'body text\'\n+ assert info.fieldname == "body"\n+ assert info.field == ITest["body"]\n+ assert info.value == "body text"\ndiff --git a/plone/dexterity/tests/test_schema.py b/plone/dexterity/tests/test_schema.py\nindex 87b3ec6..35e90e9 100644\n--- a/plone/dexterity/tests/test_schema.py\n+++ b/plone/dexterity/tests/test_schema.py\n@@ -20,20 +20,20 @@\n except ImportError:\n from mock import Mock\n \n-class TestSchemaModuleFactory(MockTestCase):\n \n+class TestSchemaModuleFactory(MockTestCase):\n def test_transient_schema(self):\n \n # No IDexterityFTI registered\n factory = schema.SchemaModuleFactory()\n- schemaName = schema.portalTypeToSchemaName(\'testtype\', prefix=\'site\')\n+ schemaName = schema.portalTypeToSchemaName("testtype", prefix="site")\n klass = factory(schemaName, schema.generated)\n \n self.assertTrue(isinstance(klass, InterfaceClass))\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n self.assertEqual((), tuple(zope.schema.getFields(klass)))\n \n def test_concrete_default_schema(self):\n@@ -41,24 +41,25 @@ def test_concrete_default_schema(self):\n # Mock schema model\n class IDummy(Interface):\n dummy = zope.schema.TextLine(title=u"Dummy")\n+\n mock_model = Model({u"": IDummy})\n \n # Mock FTI\n fti_mock = Mock(spec=DexterityFTI)\n fti_mock.lookupModel = Mock(return_value=mock_model)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n factory = schema.SchemaModuleFactory()\n \n- schemaName = schema.portalTypeToSchemaName(\'testtype\', prefix=\'site\')\n+ schemaName = schema.portalTypeToSchemaName("testtype", prefix="site")\n klass = factory(schemaName, schema.generated)\n \n self.assertTrue(isinstance(klass, InterfaceClass))\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n- self.assertEqual((\'dummy\',), tuple(zope.schema.getFieldNames(klass)))\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n+ self.assertEqual(("dummy",), tuple(zope.schema.getFieldNames(klass)))\n \n def test_named_schema(self):\n \n@@ -68,20 +69,18 @@ class IDummy(Interface):\n \n class INamedDummy(Interface):\n named = zope.schema.TextLine(title=u"Named")\n- mock_model = Model({u"": IDummy,\n- u"named": INamedDummy})\n+\n+ mock_model = Model({u"": IDummy, u"named": INamedDummy})\n \n # Mock FTI\n fti_mock = Mock(spec=DexterityFTI)\n fti_mock.lookupModel = Mock(return_value=mock_model)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n factory = schema.SchemaModuleFactory()\n \n schemaName = schema.portalTypeToSchemaName(\n- \'testtype\',\n- schema=u"named",\n- prefix=\'site\'\n+ "testtype", schema=u"named", prefix="site"\n )\n klass = factory(schemaName, schema.generated)\n \n@@ -92,13 +91,13 @@ class INamedDummy(Interface):\n \n self.assertFalse(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n- self.assertEqual((\'named\',), tuple(zope.schema.getFieldNames(klass)))\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n+ self.assertEqual(("named",), tuple(zope.schema.getFieldNames(klass)))\n \n def test_transient_schema_made_concrete(self):\n \n factory = schema.SchemaModuleFactory()\n- schemaName = schema.portalTypeToSchemaName(\'testtype\', prefix=\'site\')\n+ schemaName = schema.portalTypeToSchemaName("testtype", prefix="site")\n \n # No IDexterityFTI registered\n \n@@ -107,7 +106,7 @@ def test_transient_schema_made_concrete(self):\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n self.assertEqual((), tuple(zope.schema.getFields(klass)))\n \n # Calling it again gives the same result\n@@ -117,18 +116,19 @@ def test_transient_schema_made_concrete(self):\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n self.assertEqual((), tuple(zope.schema.getFields(klass)))\n \n # Now register a mock FTI and try again\n \n class IDummy(Interface):\n dummy = zope.schema.TextLine(title=u"Dummy")\n+\n mock_model = Model({u"": IDummy})\n \n fti_mock = Mock(spec=DexterityFTI)\n fti_mock.lookupModel = Mock(return_value=mock_model)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n klass = factory(schemaName, schema.generated)\n \n@@ -136,61 +136,64 @@ class IDummy(Interface):\n self.assertTrue(klass.isOrExtends(IDexteritySchema))\n self.assertTrue(IContentType.providedBy(klass))\n self.assertEqual(schemaName, klass.__name__)\n- self.assertEqual(\'plone.dexterity.schema.generated\', klass.__module__)\n+ self.assertEqual("plone.dexterity.schema.generated", klass.__module__)\n \n # Now we get the fields from the FTI\'s model\n- self.assertEqual((\'dummy\',), tuple(zope.schema.getFieldNames(klass)))\n+ self.assertEqual(("dummy",), tuple(zope.schema.getFieldNames(klass)))\n \n def test_portalTypeToSchemaName_with_schema_and_prefix(self):\n self.assertEqual(\n- \'prefix_0_type_0_schema\',\n- schema.portalTypeToSchemaName(\'type\', \'schema\', \'prefix\')\n+ "prefix_0_type_0_schema",\n+ schema.portalTypeToSchemaName("type", "schema", "prefix"),\n )\n self.assertEqual(\n- \'prefix_0_type\',\n- schema.portalTypeToSchemaName(\'type\', \'\', \'prefix\')\n+ "prefix_0_type", schema.portalTypeToSchemaName("type", "", "prefix")\n )\n self.assertEqual(\n- \'prefix_0_type_1_one_2_two\',\n- schema.portalTypeToSchemaName(\'type one.two\', \'\', \'prefix\')\n+ "prefix_0_type_1_one_2_two",\n+ schema.portalTypeToSchemaName("type one.two", "", "prefix"),\n )\n \n def test_portalTypeToSchemaName_looks_up_portal_for_prefix(self):\n portal_mock = Mock()\n- portal_mock.getPhysicalPath = Mock(return_value=[\'\', \'foo\', \'portalid\'])\n+ portal_mock.getPhysicalPath = Mock(return_value=["", "foo", "portalid"])\n self.mock_utility(portal_mock, ISiteRoot)\n \n- self.assertEqual(\n- \'foo_4_portalid_0_type\',\n- schema.portalTypeToSchemaName(\'type\')\n- )\n+ self.assertEqual("foo_4_portalid_0_type", schema.portalTypeToSchemaName("type"))\n \n def test_schemaNameToPortalType(self):\n self.assertEqual(\n- \'type\',\n- schema.schemaNameToPortalType(\'prefix_0_type_0_schema\')\n- )\n- self.assertEqual(\n- \'type\',\n- schema.schemaNameToPortalType(\'prefix_0_type\')\n+ "type", schema.schemaNameToPortalType("prefix_0_type_0_schema")\n )\n+ self.assertEqual("type", schema.schemaNameToPortalType("prefix_0_type"))\n self.assertEqual(\n- \'type one.two\',\n- schema.schemaNameToPortalType(\'prefix_0_type_1_one_2_two\')\n+ "type one.two", schema.schemaNameToPortalType("prefix_0_type_1_one_2_two")\n )\n \n def test_splitSchemaName(self):\n self.assertEqual(\n- (\'prefix\', \'type\', \'schema\',),\n- schema.splitSchemaName(\'prefix_0_type_0_schema\')\n+ (\n+ "prefix",\n+ "type",\n+ "schema",\n+ ),\n+ schema.splitSchemaName("prefix_0_type_0_schema"),\n )\n self.assertEqual(\n- (\'prefix\', \'type\', \'\',),\n- schema.splitSchemaName(\'prefix_0_type\')\n+ (\n+ "prefix",\n+ "type",\n+ "",\n+ ),\n+ schema.splitSchemaName("prefix_0_type"),\n )\n self.assertEqual(\n- (\'prefix\', \'type one.two\', \'\',),\n- schema.splitSchemaName(\'prefix_0_type_1_one_2_two\')\n+ (\n+ "prefix",\n+ "type one.two",\n+ "",\n+ ),\n+ schema.splitSchemaName("prefix_0_type_1_one_2_two"),\n )\n \n def test_invalidate_cache(self):\n@@ -198,9 +201,7 @@ def test_invalidate_cache(self):\n fti = DexterityFTI(portal_type)\n SCHEMA_CACHE.get(portal_type)\n SCHEMA_CACHE.behavior_schema_interfaces(fti)\n- self.assertIn(\'_v_schema_behavior_schema_interfaces\',\n- fti.__dict__.keys())\n+ self.assertIn("_v_schema_behavior_schema_interfaces", fti.__dict__.keys())\n \n invalidate_cache(fti)\n- self.assertNotIn(\'_v_schema_behavior_schema_interfaces\',\n- fti.__dict__.keys())\n+ self.assertNotIn("_v_schema_behavior_schema_interfaces", fti.__dict__.keys())\ndiff --git a/plone/dexterity/tests/test_schema_cache.py b/plone/dexterity/tests/test_schema_cache.py\nindex df4aa1a..8940b7f 100644\n--- a/plone/dexterity/tests/test_schema_cache.py\n+++ b/plone/dexterity/tests/test_schema_cache.py\n@@ -18,12 +18,10 @@\n \n \n class TestSchemaCache(MockTestCase):\n-\n def setUp(self):\n SCHEMA_CACHE.clear()\n \n def test_repeated_get_lookup(self):\n-\n class ISchema(Interface):\n pass\n \n@@ -44,24 +42,23 @@ def test_repeated_behavior_registration_lookup(self):\n # Mock a test behavior\n class ITestBehavior(Interface):\n pass\n+\n fti.behaviors = [ITestBehavior.__identifier__]\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=Interface,\n marker=ITestBehavior,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestBehavior.__identifier__\n- )\n \n- r1 = SCHEMA_CACHE.behavior_registrations(u\'testtype\')\n- r2 = SCHEMA_CACHE.behavior_registrations(u\'testtype\')\n+ self.mock_utility(registration, IBehavior, ITestBehavior.__identifier__)\n+\n+ r1 = SCHEMA_CACHE.behavior_registrations(u"testtype")\n+ r2 = SCHEMA_CACHE.behavior_registrations(u"testtype")\n \n self.assertTrue(r1[0] is r2[0] is registration)\n \n@@ -72,11 +69,11 @@ def test_unexistent_behaviors_lookup(self):\n fti.behaviors = ["foo.bar"]\n \n with patch("warnings.warn") as mock_warnings:\n- SCHEMA_CACHE.behavior_registrations(u\'testtype\')\n+ SCHEMA_CACHE.behavior_registrations(u"testtype")\n # Verify the warning has been issued\n mock_warnings.assert_called_once_with(\n (\n- \'No behavior registration found for behavior named \'\n+ "No behavior registration found for behavior named "\n \'"foo.bar" for factory "testtype" - trying deprecated \'\n \'fallback lookup (will be removed in 3.0)..."\'\n ),\n@@ -94,21 +91,20 @@ class ITestSchema(Interface):\n \n class ITestMarker(Interface):\n pass\n+\n fti.behaviors = [ITestSchema.__identifier__]\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=ITestSchema,\n marker=ITestMarker,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestSchema.__identifier__\n- )\n+\n+ self.mock_utility(registration, IBehavior, ITestSchema.__identifier__)\n \n s1 = SCHEMA_CACHE.subtypes(u"testtype")\n s2 = SCHEMA_CACHE.subtypes(u"testtype")\n@@ -116,7 +112,6 @@ class ITestMarker(Interface):\n self.assertTrue(s1[0] is s2[0] is ITestMarker)\n \n def test_repeated_lookup_with_changed_schema(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -133,7 +128,6 @@ class ISchema2(Interface):\n self.assertTrue(schema1 is schema2 and schema2 is ISchema1)\n \n def test_repeated_lookup_with_changed_schema_and_invalidation(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -152,7 +146,6 @@ class ISchema2(Interface):\n self.assertTrue(schema2 is ISchema2)\n \n def test_none_not_cached(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -160,34 +153,32 @@ class ISchema1(Interface):\n fti.lookupSchema = Mock(side_effect=[None, ISchema1, ISchema1])\n self.mock_utility(fti, IDexterityFTI, name=u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema1 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema2 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema3 = SCHEMA_CACHE.get(u"testtype")\n \n self.assertTrue(schema1 is None)\n self.assertTrue(schema2 is schema3 is ISchema1)\n \n def test_attribute_and_value_error_not_cached(self):\n-\n class ISchema1(Interface):\n pass\n \n fti = DexterityFTI(u"testtype")\n- fti.lookupSchema = Mock(\n- side_effect=[AttributeError, ValueError, ISchema1])\n+ fti.lookupSchema = Mock(side_effect=[AttributeError, ValueError, ISchema1])\n self.mock_utility(fti, IDexterityFTI, name=u"testtype")\n \n schema1 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema2 = SCHEMA_CACHE.get(u"testtype")\n \n- SCHEMA_CACHE.invalidate(\'testtype\')\n+ SCHEMA_CACHE.invalidate("testtype")\n schema3 = SCHEMA_CACHE.get(u"testtype")\n \n self.assertTrue(schema1 is None)\n@@ -195,7 +186,6 @@ class ISchema1(Interface):\n self.assertTrue(schema3 is ISchema1)\n \n def test_unknown_type_not_cached(self):\n-\n class ISchema1(Interface):\n pass\n \n@@ -211,7 +201,6 @@ class ISchema1(Interface):\n self.assertTrue(schema2 is schema3 is ISchema1)\n \n def test_clear_all_caches(self):\n-\n class ISchema1(Interface):\n pass\n \ndiff --git a/plone/dexterity/tests/test_security.py b/plone/dexterity/tests/test_security.py\nindex aeebc0b..af4ccd6 100644\n--- a/plone/dexterity/tests/test_security.py\n+++ b/plone/dexterity/tests/test_security.py\n@@ -18,8 +18,9 @@\n from unittest.mock import Mock\n except ImportError:\n from mock import Mock\n-class TestAttributeProtection(MockTestCase):\n \n+\n+class TestAttributeProtection(MockTestCase):\n def setUp(self):\n SCHEMA_CACHE.clear()\n \n@@ -30,8 +31,7 @@ class ITestSchema(Interface):\n test = zope.schema.TextLine(title=u"Test")\n \n ITestSchema.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test=\'zope2.View\', foo=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test="zope2.View", foo="foo.View")\n )\n \n from plone.autoform.interfaces import IFormFieldProvider\n@@ -41,54 +41,46 @@ class ITestBehavior(Interface):\n test2 = zope.schema.TextLine(title=u"Test")\n \n ITestBehavior.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test2=\'zope2.View\', foo2=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test2="zope2.View", foo2="foo.View")\n )\n \n # Mock a test behavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=ITestBehavior,\n marker=Interface,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestBehavior.__identifier__\n- )\n+\n+ self.mock_utility(registration, IBehavior, ITestBehavior.__identifier__)\n+ from plone.behavior.interfaces import IBehaviorAssignable\n from plone.dexterity.behavior import DexterityBehaviorAssignable\n from plone.dexterity.interfaces import IDexterityContent\n- from plone.behavior.interfaces import IBehaviorAssignable\n+\n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.behaviors = ()\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Mock permissions\n self.mock_utility(\n- Permission(u\'zope2.View\', u"View"),\n- IPermission,\n- u\'zope2.View\'\n+ Permission(u"zope2.View", u"View"), IPermission, u"zope2.View"\n )\n self.mock_utility(\n- Permission(u\'foo.View\', u"View foo"),\n- IPermission,\n- u\'foo.View\'\n+ Permission(u"foo.View", u"View foo"), IPermission, u"foo.View"\n )\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n@@ -96,30 +88,27 @@ class ITestBehavior(Interface):\n # mock security manager\n security_manager_mock = Mock()\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n # run 1: schema and no behavior access to schema protected attribute\n security_manager_mock.checkPermission = Mock(return_value=False)\n SCHEMA_CACHE.clear()\n self.assertFalse(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n+ item.__allow_access_to_unprotected_subobjects__("test", u"foo")\n )\n- security_manager_mock.checkPermission.assert_called_with(\'View\', item)\n+ security_manager_mock.checkPermission.assert_called_with("View", item)\n \n # run 2: schema and no behavior access to known non schema attribute\n security_manager_mock.checkPermission = Mock(return_value=True)\n SCHEMA_CACHE.clear()\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View foo\', item)\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n+ security_manager_mock.checkPermission.assert_called_with("View foo", item)\n \n # run 3: schema and no behavior, unknown attributes are allowed\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n # run 4: schema and behavior\n@@ -127,18 +116,18 @@ class ITestBehavior(Interface):\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test2\', u"foo2")\n+ item.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\'View\', item)\n+ security_manager_mock.checkPermission.assert_called_with("View", item)\n \n # run 5: no schema but behavior\n security_manager_mock.checkPermission = Mock(return_value=True)\n fti_mock.lookupSchema = Mock(return_value=None)\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test2\', u"foo2")\n+ item.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\'View\', item)\n+ security_manager_mock.checkPermission.assert_called_with("View", item)\n \n def test_container(self):\n \n@@ -147,8 +136,7 @@ class ITestSchema(Interface):\n test = zope.schema.TextLine(title=u"Test")\n \n ITestSchema.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test=\'zope2.View\', foo=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test="zope2.View", foo="foo.View")\n )\n \n from plone.autoform.interfaces import IFormFieldProvider\n@@ -158,54 +146,46 @@ class ITestBehavior(Interface):\n test2 = zope.schema.TextLine(title=u"Test")\n \n ITestBehavior.setTaggedValue(\n- READ_PERMISSIONS_KEY,\n- dict(test2=\'zope2.View\', foo2=\'foo.View\')\n+ READ_PERMISSIONS_KEY, dict(test2="zope2.View", foo2="foo.View")\n )\n \n # Mock a test behavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior",\n description=u"Provides test behavior",\n interface=ITestBehavior,\n marker=Interface,\n- factory=None\n+ factory=None,\n )\n from plone.behavior.interfaces import IBehavior\n- self.mock_utility(\n- registration,\n- IBehavior,\n- ITestBehavior.__identifier__\n- )\n+\n+ self.mock_utility(registration, IBehavior, ITestBehavior.__identifier__)\n+ from plone.behavior.interfaces import IBehaviorAssignable\n from plone.dexterity.behavior import DexterityBehaviorAssignable\n from plone.dexterity.interfaces import IDexterityContent\n- from plone.behavior.interfaces import IBehaviorAssignable\n+\n self.mock_adapter(\n- DexterityBehaviorAssignable,\n- IBehaviorAssignable,\n- (IDexterityContent,)\n+ DexterityBehaviorAssignable, IBehaviorAssignable, (IDexterityContent,)\n )\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n fti_mock.behaviors = ()\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Mock permissions\n self.mock_utility(\n- Permission(u\'zope2.View\', u"View"),\n- IPermission,\n- u\'zope2.View\'\n+ Permission(u"zope2.View", u"View"), IPermission, u"zope2.View"\n )\n self.mock_utility(\n- Permission(u\'foo.View\', u"View foo"),\n- IPermission,\n- u\'foo.View\'\n+ Permission(u"foo.View", u"View foo"), IPermission, u"foo.View"\n )\n \n # Content item\n- container = Container(\'test\')\n+ container = Container("test")\n container.portal_type = u"testtype"\n container.test = u"foo"\n container.foo = u"bar"\n@@ -213,40 +193,29 @@ class ITestBehavior(Interface):\n # mock security manager\n security_manager_mock = Mock()\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n # run 1: schema and no behavior access to schema protected attribute\n security_manager_mock.checkPermission = Mock(return_value=False)\n SCHEMA_CACHE.clear()\n self.assertFalse(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'test\',\n- u"foo"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("test", u"foo")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View", container)\n \n # run 2: schema and no behavior access to known non schema attribute\n security_manager_mock.checkPermission = Mock(return_value=True)\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'foo\',\n- u"bar"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("foo", u"bar")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View foo\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View foo", container)\n \n # run 3: schema and no behavior, unknown attributes are allowed\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'random\',\n- u"stuff"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n # run 4: schema and behavior\n@@ -254,26 +223,18 @@ class ITestBehavior(Interface):\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'test2\',\n- u"foo2"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View", container)\n \n # run 5: no schema but behavior\n fti_mock.lookupSchema = Mock(return_value=None)\n security_manager_mock.checkPermission = Mock(return_value=True)\n SCHEMA_CACHE.clear()\n self.assertTrue(\n- container.__allow_access_to_unprotected_subobjects__(\n- \'test2\',\n- u"foo2"\n- )\n+ container.__allow_access_to_unprotected_subobjects__("test2", u"foo2")\n )\n- security_manager_mock.checkPermission.assert_called_with(\n- \'View\', container)\n+ security_manager_mock.checkPermission.assert_called_with("View", container)\n \n def test_no_tagged_value(self):\n \n@@ -285,10 +246,10 @@ class ITestSchema(Interface):\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n fti_mock.behaviors = ()\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n@@ -296,16 +257,12 @@ class ITestSchema(Interface):\n SCHEMA_CACHE.clear()\n \n # Everything allowed\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n \n # Unknown attributes are allowed\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_no_read_permission(self):\n@@ -313,22 +270,23 @@ def test_no_read_permission(self):\n # Mock schema model\n class ITestSchema(Interface):\n test = zope.schema.TextLine(title=u"Test")\n- ITestSchema.setTaggedValue(READ_PERMISSIONS_KEY, dict(foo=\'foo.View\'))\n+\n+ ITestSchema.setTaggedValue(READ_PERMISSIONS_KEY, dict(foo="foo.View"))\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITestSchema)\n fti_mock.behaviors = ()\n \n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Mock permissions\n self.mock_utility(\n- Permission(u\'foo.View\', u"View foo"), IPermission, u\'foo.View\'\n+ Permission(u"foo.View", u"View foo"), IPermission, u"foo.View"\n )\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n@@ -337,21 +295,17 @@ class ITestSchema(Interface):\n security_manager_mock = Mock()\n security_manager_mock.checkPermission = Mock(return_value=True)\n from AccessControl import getSecurityManager\n- self.patch_global(\n- getSecurityManager, return_value=security_manager_mock)\n+\n+ self.patch_global(getSecurityManager, return_value=security_manager_mock)\n \n SCHEMA_CACHE.clear()\n \n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n \n # Unknown attributes are allowed\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_no_schema(self):\n@@ -360,24 +314,20 @@ def test_no_schema(self):\n fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=None)\n fti_mock.behaviors = ()\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n \n SCHEMA_CACHE.clear()\n \n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_schema_exception(self):\n@@ -387,38 +337,32 @@ def test_schema_exception(self):\n fti_mock.lookupSchema = Mock(side_effect=AttributeError)\n fti_mock.behaviors = ()\n \n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n item.test = u"foo"\n item.foo = u"bar"\n \n SCHEMA_CACHE.clear()\n \n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("test", u"foo"))\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("foo", u"bar"))\n self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'test\', u"foo")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'foo\', u"bar")\n- )\n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'random\', u"stuff")\n+ item.__allow_access_to_unprotected_subobjects__("random", u"stuff")\n )\n \n def test_empty_name(self):\n \n # Mock FTI\n fti_mock = DexterityFTI(u"testtype")\n- self.mock_utility(fti_mock, IDexterityFTI, u\'testtype\')\n+ self.mock_utility(fti_mock, IDexterityFTI, u"testtype")\n \n # Content item\n- item = Item(\'test\')\n+ item = Item("test")\n item.portal_type = u"testtype"\n \n SCHEMA_CACHE.clear()\n \n- self.assertTrue(\n- item.__allow_access_to_unprotected_subobjects__(\'\', u"foo")\n- )\n+ self.assertTrue(item.__allow_access_to_unprotected_subobjects__("", u"foo"))\ndiff --git a/plone/dexterity/tests/test_utils.py b/plone/dexterity/tests/test_utils.py\nindex c4c7401..37a8296 100644\n--- a/plone/dexterity/tests/test_utils.py\n+++ b/plone/dexterity/tests/test_utils.py\n@@ -11,11 +11,10 @@\n \n \n class TestUtils(MockTestCase):\n-\n def test_getAdditionalSchemata(self):\n- from plone.dexterity.interfaces import IDexterityFTI\n- from plone.behavior.interfaces import IBehavior\n from plone.autoform.interfaces import IFormFieldProvider\n+ from plone.behavior.interfaces import IBehavior\n+ from plone.dexterity.interfaces import IDexterityFTI\n from zope.interface import Interface\n from zope.interface import providedBy\n \n@@ -26,10 +25,10 @@ class IBehaviorSchema(Interface):\n pass\n \n behavior_mock = Mock()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n \n- portal_type = \'prefix_0_type_0_schema\'\n- behavior_name = \'behavior_0\'\n+ portal_type = "prefix_0_type_0_schema"\n+ behavior_name = "behavior_0"\n \n fti_mock.behaviors = (behavior_name,)\n behavior_mock.interface = IBehaviorInterface\n@@ -40,9 +39,7 @@ class IBehaviorSchema(Interface):\n self.mock_utility(fti_mock, IDexterityFTI, portal_type)\n \n self.mock_adapter(\n- provider_mock,\n- IFormFieldProvider,\n- (providedBy(IBehaviorInterface), )\n+ provider_mock, IFormFieldProvider, (providedBy(IBehaviorInterface),)\n )\n \n generator = utils.getAdditionalSchemata(None, portal_type)\n@@ -53,39 +50,44 @@ class IBehaviorSchema(Interface):\n self.assertTrue(schemata is IBehaviorSchema)\n \n def testAddContentToContainer_preserves_existing_id(self):\n- from plone.dexterity.content import Item\n from plone.dexterity.content import Container\n+ from plone.dexterity.content import Item\n+\n container = Container()\n- container._ordering = u\'unordered\'\n+ container._ordering = u"unordered"\n # Allow anyone to access the contents information on the container.\n # This allows to check for existing content with the same id.\n container.manage_permission(\n- \'Access contents information\', [\'Anonymous\'], acquire=1)\n+ "Access contents information", ["Anonymous"], acquire=1\n+ )\n \n- from zope.component import provideAdapter, provideUtility\n- from zope.container.interfaces import INameChooser\n- from zope.interface import Interface\n from plone.app.content.namechooser import NormalizingNameChooser\n from plone.folder.interfaces import IOrdering\n from plone.folder.unordered import UnorderedOrdering\n- from plone.i18n.normalizer.interfaces import IURLNormalizer\n from plone.i18n.normalizer import URLNormalizer\n+ from plone.i18n.normalizer.interfaces import IURLNormalizer\n+ from zope.component import provideAdapter\n+ from zope.component import provideUtility\n+ from zope.container.interfaces import INameChooser\n+ from zope.interface import Interface\n+\n provideAdapter(NormalizingNameChooser, [Interface], INameChooser)\n provideUtility(URLNormalizer(), IURLNormalizer)\n provideAdapter(UnorderedOrdering, [Interface], IOrdering)\n \n # if the item has an id already, use it\n from plone.dexterity.utils import addContentToContainer\n+\n item = Item()\n- item.id = \'foo\'\n+ item.id = "foo"\n item = addContentToContainer(container, item, checkConstraints=False)\n- self.assertEqual(item.id, \'foo\')\n+ self.assertEqual(item.id, "foo")\n \n # unless it\'s a duplicate\n item = Item()\n- item.id = \'foo\'\n+ item.id = "foo"\n item = addContentToContainer(container, item, checkConstraints=False)\n- self.assertEqual(item.id, \'foo-1\')\n+ self.assertEqual(item.id, "foo-1")\n \n def test_all_merged_tagged_values_dict(self):\n from zope.interface import Interface\n@@ -97,23 +99,20 @@ class IIFace2(Interface):\n pass\n \n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"), {}\n )\n \n- IIFace1.setTaggedValue(\'foo\', {\'a\': 10})\n- IIFace1.setTaggedValue(\'bar\', {\'a\': 11})\n+ IIFace1.setTaggedValue("foo", {"a": 10})\n+ IIFace1.setTaggedValue("bar", {"a": 11})\n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {\'a\': 10}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"), {"a": 10}\n )\n- IIFace2.setTaggedValue(\'foo\', {\'a\': 12})\n+ IIFace2.setTaggedValue("foo", {"a": 12})\n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {\'a\': 12}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"), {"a": 12}\n )\n- IIFace2.setTaggedValue(\'foo\', {\'a\': 13, \'b\': 14})\n+ IIFace2.setTaggedValue("foo", {"a": 13, "b": 14})\n self.assertEqual(\n- utils.all_merged_tagged_values_dict((IIFace1, IIFace2), \'foo\'),\n- {\'a\': 13, \'b\': 14}\n+ utils.all_merged_tagged_values_dict((IIFace1, IIFace2), "foo"),\n+ {"a": 13, "b": 14},\n )\ndiff --git a/plone/dexterity/tests/test_views.py b/plone/dexterity/tests/test_views.py\nindex a5a6cb0..e27e728 100644\n--- a/plone/dexterity/tests/test_views.py\n+++ b/plone/dexterity/tests/test_views.py\n@@ -50,6 +50,7 @@ class TestRequest(TestRequestBase):\n """Zope 3\'s TestRequest doesn\'t support item assignment, but Zope 2\'s\n request does.\n """\n+\n def __setitem__(self, key, value):\n pass\n \n@@ -90,7 +91,6 @@ def enumerateBehaviors(self):\n \n \n class TestAddView(MockTestCase):\n-\n def test_addview_sets_form_portal_type(self):\n \n context = Container(u"container")\n@@ -110,7 +110,7 @@ def test_form_create(self):\n # FTI - returns dummy factory name\n \n fti_mock = DexterityFTI(u"testtype")\n- fti_mock.factory = u\'testfactory\'\n+ fti_mock.factory = u"testfactory"\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # The form we\'re testing\n@@ -119,6 +119,7 @@ def test_form_create(self):\n \n class ISchema(Interface):\n foo = schema.TextLine()\n+\n form.fields = Fields(ISchema)\n \n # createObject and applyChanges\n@@ -128,11 +129,12 @@ class ISchema(Interface):\n data_dummy = {u"foo": u"bar"}\n \n from zope.component import createObject\n+\n self.patch_global(createObject, return_value=obj_dummy)\n \n provideAdapter(AttributeField)\n \n- portal = self.create_dummy(getPhysicalPath=lambda: (\'\', \'site\'))\n+ portal = self.create_dummy(getPhysicalPath=lambda: ("", "site"))\n self.mock_utility(portal, ISiteRoot)\n \n self.assertEqual(obj_dummy, form.create(data_dummy))\n@@ -145,13 +147,12 @@ def test_add(self):\n obj = Mock()\n request = TestRequest()\n \n- container._setObject = Mock(return_value=u\'newid\')\n+ container._setObject = Mock(return_value=u"newid")\n container._getOb = Mock(return_value=obj)\n- container.absolute_url = Mock(\n- return_value="http://nohost/plone/container")\n+ container.absolute_url = Mock(return_value="http://nohost/plone/container")\n \n obj.id = u"newid"\n- obj.portal_type = \'testtype\'\n+ obj.portal_type = "testtype"\n \n # New object\'s FTI\n fti_mock = DexterityFTI(u"testtype")\n@@ -161,18 +162,13 @@ def test_add(self):\n # Container FTI\n container_fti_mock = DexterityFTI(u"containertype")\n container_fti_mock.allowType = Mock(return_value=True)\n- self.mock_utility(\n- container_fti_mock,\n- IDexterityFTI,\n- name=u"containertype"\n- )\n+ self.mock_utility(container_fti_mock, IDexterityFTI, name=u"containertype")\n \n container.getTypeInfo = Mock(return_value=container_fti_mock)\n \n # Name chooser\n @implementer(INameChooser)\n class NameChooser(object):\n-\n def __init__(self, context):\n pass\n \n@@ -198,12 +194,10 @@ def test_add_raises_unauthorized_if_construction_not_allowed(self):\n \n # Container FTI\n container_fti_mock = DexterityFTI(u"containertype")\n- self.mock_utility(\n- container_fti_mock, IDexterityFTI, name=u"containertype"\n- )\n+ self.mock_utility(container_fti_mock, IDexterityFTI, name=u"containertype")\n \n container.getTypeInfo = Mock(return_value=container_fti_mock)\n- obj.portal_type = \'testtype\'\n+ obj.portal_type = "testtype"\n \n form = DefaultAddForm(container, request)\n form.portal_type = u"testtype"\n@@ -216,7 +210,7 @@ def test_add_raises_value_error_if_type_not_addable(self):\n obj = Mock()\n request = TestRequest()\n \n- obj.portal_type = \'testtype\'\n+ obj.portal_type = "testtype"\n \n # New object\'s FTI\n fti_mock = DexterityFTI(u"testtype")\n@@ -226,11 +220,7 @@ def test_add_raises_value_error_if_type_not_addable(self):\n # Container FTI\n container_fti_mock = DexterityFTI(u"containertype")\n container_fti_mock.allowType = Mock(return_value=False)\n- self.mock_utility(\n- container_fti_mock,\n- IDexterityFTI,\n- name=u"containertype"\n- )\n+ self.mock_utility(container_fti_mock, IDexterityFTI, name=u"containertype")\n \n container.getTypeInfo = Mock(return_value=container_fti_mock)\n \n@@ -248,12 +238,12 @@ def test_label(self):\n context_mock = Mock()\n request_mock = TestRequest()\n \n- request_mock.form[\'disable_border\'] = True\n+ request_mock.form["disable_border"] = True\n \n # FTI\n \n fti_mock = DexterityFTI(u"testtype")\n- fti_mock.Title = Mock(return_value=u\'Test title\')\n+ fti_mock.Title = Mock(return_value=u"Test title")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # Form\n@@ -263,12 +253,12 @@ def test_label(self):\n \n label = addform.label\n self.assertEqual(u"Add ${name}", six.text_type(label))\n- self.assertEqual(u"Test title", label.mapping[\'name\'])\n+ self.assertEqual(u"Test title", label.mapping["name"])\n \n def test_schema_lookup_add(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n request_mock = TestRequest()\n \n # FTI\n@@ -277,48 +267,37 @@ def test_schema_lookup_add(self):\n fti_mock.behaviors = (\n IBehaviorOne.__identifier__,\n IBehaviorTwo.__identifier__,\n- IBehaviorThree.__identifier__\n+ IBehaviorThree.__identifier__,\n )\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n from plone.behavior.interfaces import IBehavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior 1",\n description=u"Provides test behavior",\n interface=IBehaviorOne,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorOne.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorOne.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 2",\n description=u"Provides test behavior",\n interface=IBehaviorTwo,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorTwo.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorTwo.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 3",\n description=u"Provides test behavior",\n interface=IBehaviorThree,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorThree.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorThree.__identifier__)\n \n # Form\n view = DefaultAddForm(context_mock, request_mock)\n@@ -327,31 +306,22 @@ def test_schema_lookup_add(self):\n self.assertEqual(ISchema, view.schema)\n \n # we expect here only formfieldprovider!\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n # When we register our own IBehaviorAssignable we can\n # influence what goes into the additionalSchemata. But in an Addform\n # this never grips, since its an adapter on context, and contextless\n # there is always the FTI the only valid source\n- self.mock_adapter(\n- NoBehaviorAssignable,\n- IBehaviorAssignable,\n- [Interface]\n- )\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.mock_adapter(NoBehaviorAssignable, IBehaviorAssignable, [Interface])\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n def test_fires_add_begun_event(self):\n \n # Context and request\n context_mock = self.create_dummy(\n- portal_type=u\'testtype\',\n- allowedContentTypes=lambda: [self.create_dummy(getId=lambda: \'testtype\')])\n+ portal_type=u"testtype",\n+ allowedContentTypes=lambda: [self.create_dummy(getId=lambda: "testtype")],\n+ )\n request_mock = TestRequest()\n \n # FTI\n@@ -359,16 +329,13 @@ def test_fires_add_begun_event(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n \n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -383,8 +350,8 @@ def test_update_checks_allowed_types(self):\n \n # Context and request\n context_mock = self.create_dummy(\n- portal_type=u\'testtype\',\n- allowedContentTypes=lambda: [])\n+ portal_type=u"testtype", allowedContentTypes=lambda: []\n+ )\n request_mock = TestRequest()\n \n # FTI\n@@ -392,11 +359,7 @@ def test_update_checks_allowed_types(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n \n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n@@ -409,8 +372,8 @@ def test_update_ignores_type_check_if_security_check_deferred(self):\n \n # Context and request\n context_mock = self.create_dummy(\n- portal_type=u\'testtype\',\n- allowedContentTypes=lambda: [])\n+ portal_type=u"testtype", allowedContentTypes=lambda: []\n+ )\n request_mock = TestRequest()\n alsoProvides(request_mock, IDeferSecurityCheck)\n \n@@ -419,11 +382,7 @@ def test_update_ignores_type_check_if_security_check_deferred(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n \n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n@@ -433,30 +392,29 @@ def test_update_ignores_type_check_if_security_check_deferred(self):\n try:\n view.update()\n except ValueError:\n- self.fail("Update raised Unauthorized with security checks "\n- "deferred")\n+ self.fail("Update raised Unauthorized with security checks " "deferred")\n \n def test_fires_add_cancelled_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n- context_mock.absolute_url = \\\n- lambda *a, **kw: \'http://127.0.0.1/plone/item\'\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n+ context_mock.absolute_url = lambda *a, **kw: "http://127.0.0.1/plone/item"\n request_mock = TestRequest()\n \n # mock status message\n @implementer(IStatusMessage)\n class StatusMessage(object):\n-\n def __init__(self, request):\n pass\n \n- def addStatusMessage(self, msg, type=\'\'):\n+ def addStatusMessage(self, msg, type=""):\n pass\n+\n self.mock_adapter(StatusMessage, IStatusMessage, (Interface,))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -464,12 +422,10 @@ def addStatusMessage(self, msg, type=\'\'):\n view.handleCancel(view, {})\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IAddCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IAddCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n \n \n class TestEditView(MockTestCase):\n-\n def setUp(self):\n SCHEMA_CACHE.clear()\n \n@@ -479,13 +435,13 @@ def test_label(self):\n \n # Context and request\n \n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n request_mock = TestRequest()\n \n # FTI\n \n fti_mock = DexterityFTI(u"testtype")\n- fti_mock.Title = Mock(return_value=u\'Test title\')\n+ fti_mock.Title = Mock(return_value=u"Test title")\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n # Form\n@@ -496,7 +452,7 @@ def test_label(self):\n \n label = editview.label\n self.assertEqual(u"Edit ${name}", six.text_type(label))\n- self.assertEqual(u"Test title", label.mapping[\'name\'])\n+ self.assertEqual(u"Test title", label.mapping["name"])\n \n def test_schema_lookup_edit(self):\n \n@@ -504,7 +460,7 @@ def test_schema_lookup_edit(self):\n class IMarker(IDexterityContent):\n pass\n \n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n alsoProvides(context_mock, IMarker)\n request_mock = TestRequest()\n \n@@ -514,48 +470,37 @@ class IMarker(IDexterityContent):\n fti_mock.behaviors = (\n IBehaviorOne.__identifier__,\n IBehaviorTwo.__identifier__,\n- IBehaviorThree.__identifier__\n+ IBehaviorThree.__identifier__,\n )\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n from plone.behavior.interfaces import IBehavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior 1",\n description=u"Provides test behavior",\n interface=IBehaviorOne,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorOne.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorOne.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 2",\n description=u"Provides test behavior",\n interface=IBehaviorTwo,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorTwo.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorTwo.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 3",\n description=u"Provides test behavior",\n interface=IBehaviorThree,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorThree.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorThree.__identifier__)\n \n # Form\n view = DefaultEditForm(context_mock, request_mock)\n@@ -564,25 +509,18 @@ class IMarker(IDexterityContent):\n self.assertEqual(ISchema, view.schema)\n \n # we expect here only formfieldprovider!\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n # When we register our own IBehaviorAssignable we can\n # influence what goes into the additionalSchemata.\n- self.mock_adapter(\n- NoBehaviorAssignable,\n- IBehaviorAssignable,\n- [IMarker]\n- )\n+ self.mock_adapter(NoBehaviorAssignable, IBehaviorAssignable, [IMarker])\n additionalSchemata = tuple(view.additionalSchemata)\n self.assertEqual(tuple(), tuple(additionalSchemata))\n \n def test_fires_edit_begun_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n request_mock = TestRequest()\n \n # FTI\n@@ -590,15 +528,12 @@ def test_fires_edit_begun_event(self):\n fti_mock.lookupSchema = Mock(return_value=ISchema)\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- self.mock_adapter(\n- FieldWidgets,\n- IWidgets,\n- (Interface, Interface, Interface)\n- )\n+ self.mock_adapter(FieldWidgets, IWidgets, (Interface, Interface, Interface))\n self.mock_adapter(Actions, IActions, (Interface, Interface, Interface))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -606,30 +541,29 @@ def test_fires_edit_begun_event(self):\n view.update()\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IEditBegunEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IEditBegunEvent.providedBy(notify_mock.call_args[0][0]))\n \n def test_fires_edit_cancelled_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\', title=u\'foo\')\n- context_mock.absolute_url = \\\n- lambda *a, **kw: \'http://127.0.0.1/plone/item\'\n+ context_mock = self.create_dummy(portal_type=u"testtype", title=u"foo")\n+ context_mock.absolute_url = lambda *a, **kw: "http://127.0.0.1/plone/item"\n request_mock = TestRequest()\n \n # mock status message\n @implementer(IStatusMessage)\n class StatusMessage(object):\n-\n def __init__(self, request):\n pass\n \n- def addStatusMessage(self, msg, type=\'\'):\n+ def addStatusMessage(self, msg, type=""):\n pass\n+\n self.mock_adapter(StatusMessage, IStatusMessage, (Interface,))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n@@ -637,53 +571,50 @@ def addStatusMessage(self, msg, type=\'\'):\n view.handleCancel(view, {})\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IEditCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IEditCancelledEvent.providedBy(notify_mock.call_args[0][0]))\n \n def test_fires_edit_finished_event(self):\n \n # Context and request\n- context_mock = self.create_dummy(portal_type=u\'testtype\', title=u\'foo\')\n- context_mock.absolute_url = \\\n- lambda *a, **kw: \'http://127.0.0.1/plone/item\'\n+ context_mock = self.create_dummy(portal_type=u"testtype", title=u"foo")\n+ context_mock.absolute_url = lambda *a, **kw: "http://127.0.0.1/plone/item"\n request_mock = TestRequest()\n \n # mock status message\n @implementer(IStatusMessage)\n class StatusMessage(object):\n-\n def __init__(self, request):\n pass\n \n- def addStatusMessage(self, msg, type=\'\'):\n+ def addStatusMessage(self, msg, type=""):\n pass\n+\n self.mock_adapter(StatusMessage, IStatusMessage, (Interface,))\n \n # mock notify\n from zope.event import notify\n+\n notify_mock = self.patch_global(notify)\n \n # Form\n view = DefaultEditForm(context_mock, request_mock)\n view.widgets = Mock()\n- view.widgets.extract = Mock(return_value=({\'title\': u\'foo\'}, []))\n+ view.widgets.extract = Mock(return_value=({"title": u"foo"}, []))\n view.applyChanges = Mock()\n view.handleApply(view, {})\n \n self.assertTrue(notify_mock.called)\n- self.assertTrue(\n- IEditFinishedEvent.providedBy(notify_mock.call_args[0][0]))\n+ self.assertTrue(IEditFinishedEvent.providedBy(notify_mock.call_args[0][0]))\n \n \n class TestDefaultView(MockTestCase):\n-\n def test_schema_lookup_default_view(self):\n \n # Context and request\n class IMarker(IDexterityContent):\n pass\n \n- context_mock = self.create_dummy(portal_type=u\'testtype\')\n+ context_mock = self.create_dummy(portal_type=u"testtype")\n alsoProvides(context_mock, IMarker)\n request_mock = TestRequest()\n \n@@ -693,48 +624,37 @@ class IMarker(IDexterityContent):\n fti_mock.behaviors = (\n IBehaviorOne.__identifier__,\n IBehaviorTwo.__identifier__,\n- IBehaviorThree.__identifier__\n+ IBehaviorThree.__identifier__,\n )\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n from plone.behavior.interfaces import IBehavior\n from plone.behavior.registration import BehaviorRegistration\n+\n registration = BehaviorRegistration(\n title=u"Test Behavior 1",\n description=u"Provides test behavior",\n interface=IBehaviorOne,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorOne.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorOne.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 2",\n description=u"Provides test behavior",\n interface=IBehaviorTwo,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorTwo.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorTwo.__identifier__)\n registration = BehaviorRegistration(\n title=u"Test Behavior 3",\n description=u"Provides test behavior",\n interface=IBehaviorThree,\n marker=None,\n- factory=None\n- )\n- self.mock_utility(\n- registration,\n- IBehavior,\n- IBehaviorThree.__identifier__\n+ factory=None,\n )\n+ self.mock_utility(registration, IBehavior, IBehaviorThree.__identifier__)\n \n # Form\n view = DefaultView(context_mock, request_mock)\n@@ -743,17 +663,10 @@ class IMarker(IDexterityContent):\n self.assertEqual(ISchema, view.schema)\n \n # we expect here only formfieldprovider!\n- self.assertEqual(\n- (IBehaviorOne, IBehaviorTwo),\n- tuple(view.additionalSchemata)\n- )\n+ self.assertEqual((IBehaviorOne, IBehaviorTwo), tuple(view.additionalSchemata))\n \n # When we register our own IBehaviorAssignable we can\n # influence what goes into the additionalSchemata.\n- self.mock_adapter(\n- NoBehaviorAssignable,\n- IBehaviorAssignable,\n- [IMarker]\n- )\n+ self.mock_adapter(NoBehaviorAssignable, IBehaviorAssignable, [IMarker])\n additionalSchemata = tuple(view.additionalSchemata)\n self.assertEqual(tuple(), tuple(additionalSchemata))\ndiff --git a/plone/dexterity/tests/test_webdav.py b/plone/dexterity/tests/test_webdav.py\nindex a204e1f..b753f88 100644\n--- a/plone/dexterity/tests/test_webdav.py\n+++ b/plone/dexterity/tests/test_webdav.py\n@@ -35,10 +35,10 @@\n from zope.filerepresentation.interfaces import IFileFactory\n from zope.filerepresentation.interfaces import IRawReadFile\n from zope.filerepresentation.interfaces import IRawWriteFile\n- from zope.interface import provider\n from zope.interface import alsoProvides\n from zope.interface import implementer\n from zope.interface import Interface\n+ from zope.interface import provider\n from zope.lifecycleevent.interfaces import IObjectModifiedEvent\n from zope.publisher.browser import TestRequest\n from zope.size.interfaces import ISized\n@@ -53,20 +53,17 @@\n except ImportError:\n from mock import Mock\n \n-\n if six.PY2:\n # cope with upstream library changes in rendering the XML prolog\n XML_PROLOG = b\'\'\n else:\n XML_PROLOG = b\'\'\n \n-\n @provider(IFormFieldProvider)\n class ITestBehavior(Interface):\n foo = schema.Int()\n bar = schema.Bytes()\n \n-\n class DAVTestRequest(TestRequest):\n \n get_header = TestRequest.getHeader\n@@ -74,11 +71,9 @@ class DAVTestRequest(TestRequest):\n def _createResponse(self):\n return HTTPResponse()\n \n-\n class TestWebZope2DAVAPI(MockTestCase):\n-\n def test_get_size_no_adapter(self):\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(0, item.get_size())\n \n@@ -88,12 +83,13 @@ def __init__(self, context):\n self.context = context\n \n def sizeForSorting(self):\n- return \'lines\', 10\n+ return "lines", 10\n \n def sizeForDisplay(self):\n- \'10 lines\'\n+ "10 lines"\n+\n self.mock_adapter(SizedAdapter, ISized, (Item,))\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(0, item.get_size())\n \n@@ -103,17 +99,18 @@ def __init__(self, context):\n self.context = context\n \n def sizeForSorting(self):\n- return \'bytes\', 10\n+ return "bytes", 10\n \n def sizeForDisplay(self):\n- \'10 bytes\'\n+ "10 bytes"\n+\n self.mock_adapter(SizedAdapter, ISized, (Item,))\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(10, item.get_size())\n \n def test_content_type_no_adapter(self):\n- item = Item(\'test\')\n+ item = Item("test")\n \n self.assertEqual(None, item.content_type())\n self.assertEqual(None, item.Format())\n@@ -122,49 +119,53 @@ def test_content_type_simple_adapter(self):\n class ReadFileAdapter(object):\n def __init__(self, context):\n self.context = context\n- mimeType = \'text/foo\'\n+\n+ mimeType = "text/foo"\n # others omitted\n+\n self.mock_adapter(ReadFileAdapter, IRawReadFile, (Item,))\n- item = Item(\'test\')\n+ item = Item("test")\n \n- self.assertEqual(\'text/foo\', item.content_type())\n- self.assertEqual(\'text/foo\', item.Format())\n+ self.assertEqual("text/foo", item.content_type())\n+ self.assertEqual("text/foo", item.Format())\n \n def test_get_no_adapter(self):\n- item = Item(\'test\')\n+ item = Item("test")\n \n- self.assertEqual(\'\', item.manage_DAVget())\n+ self.assertEqual("", item.manage_DAVget())\n \n def test_get_simple_adapter(self):\n class ReadFileAdapter(object):\n def __init__(self, context):\n self.context = context\n- mimeType = \'text/foo\'\n- encoding = \'latin1\'\n+\n+ mimeType = "text/foo"\n+ encoding = "latin1"\n \n def size(self):\n return 10\n \n def read(self, size=None):\n- return \'1234567890\'\n+ return "1234567890"\n+\n self.mock_adapter(ReadFileAdapter, IRawReadFile, (Item,))\n \n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n- self.assertEqual(\'1234567890\', item.manage_DAVget())\n+ self.assertEqual("1234567890", item.manage_DAVget())\n self.assertEqual(\n- \'text/foo; charset="latin1"\',\n- request.response.getHeader(\'Content-Type\')\n+ \'text/foo; charset="latin1"\', request.response.getHeader("Content-Type")\n )\n- self.assertEqual(\'10\', request.response.getHeader(\'Content-Length\'))\n+ self.assertEqual("10", request.response.getHeader("Content-Length"))\n \n def test_get_minimal_adapter(self):\n class ReadFileAdapter(object):\n def __init__(self, context):\n self.context = context\n+\n mimeType = None\n encoding = None\n \n@@ -172,24 +173,25 @@ def size(self):\n return None\n \n def read(self, size=None):\n- return \'1234567890\'\n+ return "1234567890"\n+\n self.mock_adapter(ReadFileAdapter, IRawReadFile, (Item,))\n \n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n- self.assertEqual(\'1234567890\', item.manage_DAVget())\n- self.assertEqual(None, request.response.getHeader(\'Content-Type\'))\n- self.assertEqual(None, request.response.getHeader(\'Content-Length\'))\n+ self.assertEqual("1234567890", item.manage_DAVget())\n+ self.assertEqual(None, request.response.getHeader("Content-Type"))\n+ self.assertEqual(None, request.response.getHeader("Content-Length"))\n \n def test_get_streaming(self):\n @implementer(IStreamIterator)\n class ReadFileAdapter(object):\n-\n def __init__(self, context):\n self.context = context\n+\n mimeType = None\n encoding = None\n \n@@ -197,25 +199,26 @@ def size(self):\n return 10\n \n def read(self, size=None):\n- return \'1234567890\'\n+ return "1234567890"\n \n adapterInstance = ReadFileAdapter(None)\n \n def factory(context):\n return adapterInstance\n+\n self.mock_adapter(factory, IRawReadFile, (Item,))\n \n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n self.assertEqual(adapterInstance, item.manage_DAVget())\n \n def test_put_no_adapter(self):\n- request = DAVTestRequest(environ={\'BODYFILE\': StringIO(\'\')})\n+ request = DAVTestRequest(environ={"BODYFILE": StringIO("")})\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n self.assertRaises(MethodNotAllowed, item.PUT)\n@@ -223,7 +226,7 @@ def test_put_no_adapter(self):\n def test_put_no_body(self):\n request = DAVTestRequest()\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n self.assertRaises(MethodNotAllowed, item.PUT)\n@@ -232,8 +235,9 @@ def test_put_no_content_type_header(self):\n class WriteFile(object):\n def __init__(self, context):\n self.context = context\n- self._written = \'\'\n+ self._written = ""\n self._closed = False\n+\n mimeType = None\n encoding = None\n \n@@ -250,23 +254,24 @@ def factory(context):\n \n self.mock_adapter(factory, IRawWriteFile, (Item,))\n \n- request = DAVTestRequest(environ={\'BODYFILE\': StringIO(\'data\')})\n+ request = DAVTestRequest(environ={"BODYFILE": StringIO("data")})\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n item.PUT()\n self.assertEqual(None, adapterInstance.mimeType)\n self.assertEqual(None, adapterInstance.encoding)\n- self.assertEqual(\'data\', adapterInstance._written)\n+ self.assertEqual("data", adapterInstance._written)\n self.assertEqual(True, adapterInstance._closed)\n \n def test_put_with_content_type_header_no_charset(self):\n class WriteFile(object):\n def __init__(self, context):\n self.context = context\n- self._written = \'\'\n+ self._written = ""\n self._closed = False\n+\n mimeType = None\n encoding = None\n \n@@ -290,19 +295,16 @@ def handler(event):\n self.mock_handler(handler, (IObjectModifiedEvent,))\n \n request = DAVTestRequest(\n- environ={\n- \'BODYFILE\': StringIO(\'data\'),\n- \'HTTP_CONTENT_TYPE\': \'text/foo\'\n- }\n+ environ={"BODYFILE": StringIO("data"), "HTTP_CONTENT_TYPE": "text/foo"}\n )\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n item.PUT()\n- self.assertEqual(\'text/foo\', adapterInstance.mimeType)\n+ self.assertEqual("text/foo", adapterInstance.mimeType)\n self.assertEqual(None, adapterInstance.encoding)\n- self.assertEqual(\'data\', adapterInstance._written)\n+ self.assertEqual("data", adapterInstance._written)\n self.assertEqual(True, adapterInstance._closed)\n self.assertEqual(1, len(events))\n \n@@ -310,8 +312,9 @@ def test_put_with_content_type_header_and_charset(self):\n class WriteFile(object):\n def __init__(self, context):\n self.context = context\n- self._written = \'\'\n+ self._written = ""\n self._closed = False\n+\n mimeType = None\n encoding = None\n \n@@ -336,24 +339,24 @@ def handler(event):\n \n request = DAVTestRequest(\n environ={\n- \'BODYFILE\': StringIO(\'data\'),\n- \'HTTP_CONTENT_TYPE\': \'text/foo; charset="latin1"\'\n+ "BODYFILE": StringIO("data"),\n+ "HTTP_CONTENT_TYPE": \'text/foo; charset="latin1"\',\n }\n )\n \n- item = Item(\'item\')\n+ item = Item("item")\n item.REQUEST = request\n \n item.PUT()\n- self.assertEqual(\'text/foo\', adapterInstance.mimeType)\n- self.assertEqual(\'latin1\', adapterInstance.encoding)\n- self.assertEqual(\'data\', adapterInstance._written)\n+ self.assertEqual("text/foo", adapterInstance.mimeType)\n+ self.assertEqual("latin1", adapterInstance.encoding)\n+ self.assertEqual("data", adapterInstance._written)\n self.assertEqual(True, adapterInstance._closed)\n self.assertEqual(1, len(events))\n \n def test_mkcol_no_adapter(self):\n- container = Container(\'container\')\n- self.assertRaises(MethodNotAllowed, container.MKCOL_handler, \'test\')\n+ container = Container("container")\n+ self.assertRaises(MethodNotAllowed, container.MKCOL_handler, "test")\n \n def test_mkcol_simple_adapter(self):\n created = []\n@@ -364,18 +367,16 @@ def __init__(self, context):\n \n def __call__(self, id):\n created.append(id)\n+\n self.mock_adapter(DirectoryFactory, IDirectoryFactory, (Container,))\n \n- container = Container(\'container\')\n- container.MKCOL_handler(\'test\')\n- self.assertEqual([\'test\'], created)\n+ container = Container("container")\n+ container.MKCOL_handler("test")\n+ self.assertEqual(["test"], created)\n \n def test_put_factory_no_adapter(self):\n- container = Container(\'container\')\n- self.assertEqual(\n- None,\n- container.PUT_factory(\'test\', \'text/foo\', \'body\')\n- )\n+ container = Container("container")\n+ self.assertEqual(None, container.PUT_factory("test", "text/foo", "body"))\n \n def test_put_factory_simple_adapter(self):\n instance = object()\n@@ -386,21 +387,19 @@ def __init__(self, context):\n \n def __call__(self, name, contentType, body):\n return instance\n+\n self.mock_adapter(FileFactory, IFileFactory, (Container,))\n- container = Container(\'container\')\n+ container = Container("container")\n self.assertEqual(\n- instance,\n- container.PUT_factory(\'test\', \'text/foo\', \'body\')\n+ instance, container.PUT_factory("test", "text/foo", "body")\n )\n \n def test_list_without_items(self):\n-\n class DummyContainer(Container):\n-\n def listFolderContents(self, filter=None):\n return []\n \n- container = DummyContainer(\'container\')\n+ container = DummyContainer("container")\n \n objects = container.listDAVObjects()\n self.assertEqual(1, len(objects))\n@@ -409,122 +408,114 @@ def listFolderContents(self, filter=None):\n self.assertEqual(container, objects[0].__parent__)\n \n def test_list_with_items(self):\n-\n class DummyContainer(Container):\n-\n def listFolderContents(self, filter=None):\n- return [Item(\'foo\')]\n+ return [Item("foo")]\n \n- container = DummyContainer(\'container\')\n+ container = DummyContainer("container")\n \n objects = container.listDAVObjects()\n self.assertEqual(2, len(objects))\n self.assertTrue(isinstance(objects[0], FolderDataResource))\n self.assertEqual(DAV_FOLDER_DATA_ID, objects[0].getId())\n self.assertEqual(container, objects[0].__parent__)\n- self.assertEqual(\'foo\', objects[1].getId())\n-\n+ self.assertEqual("foo", objects[1].getId())\n \n class TestFolderDataResource(MockTestCase):\n-\n def test_getId(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container)\n \n- self.assertEqual(\'fdata\', r.getId())\n+ self.assertEqual("fdata", r.getId())\n self.assertEqual(container, r.__parent__)\n \n def test_HEAD(self):\n-\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertEqual(response, r.HEAD(request, request.response))\n self.assertEqual(200, response.getStatus())\n- self.assertTrue(\n- response.getHeader(\'Content-Type\').startswith(\'text/foo\'))\n- self.assertEqual(\'10\', response.getHeader(\'Content-Length\'))\n+ self.assertTrue(response.getHeader("Content-Type").startswith("text/foo"))\n+ self.assertEqual("10", response.getHeader("Content-Length"))\n \n def test_OPTIONS(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertEqual(response, r.OPTIONS(request, request.response))\n self.assertEqual(\n- \'GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, PROPFIND, \'\n- \'PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK\',\n- response.getHeader(\'Allow\')\n+ "GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, PROPFIND, "\n+ "PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK",\n+ response.getHeader("Allow"),\n )\n \n def test_TRACE(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n \n self.assertRaises(MethodNotAllowed, r.TRACE, request, request.response)\n \n def test_PROPFIND(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n container.manage_changeProperties(title="Container")\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertEqual(response, r.PROPFIND(request, response))\n self.assertEqual(\n- \'text/xml; charset="utf-8"\', response.getHeader(\'Content-Type\')\n+ \'text/xml; charset="utf-8"\', response.getHeader("Content-Type")\n )\n self.assertEqual(207, response.getStatus())\n \n- body = XML_PROLOG + b"""\n+ body = (\n+ XML_PROLOG\n+ + b"""\n \n \n /site/container\n@@ -558,27 +549,27 @@ def content_type(self):\n \n \n """\n+ )\n \n result = response.getBody()\n result = re.sub(\n- br\'.+\',\n- br\'...\',\n- result\n+ br".+",\n+ br"...",\n+ result,\n )\n self.assertEqual(result.strip(), body.strip())\n \n def test_PROPPATCH(self):\n class TestContainer(Container):\n-\n def get_size(self):\n return 10\n \n def content_type(self):\n- return \'text/foo\'\n+ return "text/foo"\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n container.manage_changeProperties(title="Container")\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n requestBody = """\\\n \n@@ -594,22 +585,24 @@ def content_type(self):\n \n request = DAVTestRequest(\n environ={\n- \'URL\': \'http://example.org/site/container\',\n- \'BODY\': requestBody\n+ "URL": "http://example.org/site/container",\n+ "BODY": requestBody,\n }\n )\n response = request.response\n \n self.assertEqual(response, r.PROPPATCH(request, response))\n \n- self.assertEqual(\'New title\', container.getProperty(\'title\'))\n+ self.assertEqual("New title", container.getProperty("title"))\n \n self.assertEqual(\n- \'text/xml; charset="utf-8"\', response.getHeader(\'Content-Type\')\n+ \'text/xml; charset="utf-8"\', response.getHeader("Content-Type")\n )\n self.assertEqual(207, response.getStatus())\n \n- body = XML_PROLOG + b"""\n+ body = (\n+ XML_PROLOG\n+ + b"""\n \n \n http%3A//example.org/site/container\n@@ -625,6 +618,7 @@ def content_type(self):\n \n \n """\n+ )\n \n result = response.getBody()\n \n@@ -633,16 +627,18 @@ def content_type(self):\n def test_LOCK(self):\n # Too much WebDAV magic - just test that it delegates correctly\n class TestContainer(Container):\n-\n def LOCK(self, request, response):\n- self._locked = (request, response,)\n+ self._locked = (\n+ request,\n+ response,\n+ )\n return response\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -652,16 +648,18 @@ def LOCK(self, request, response):\n def test_UNLOCK(self):\n # Too much WebDAV magic - just test that it delegates correctly\n class TestContainer(Container):\n-\n def UNLOCK(self, request, response):\n- self._unlocked = (request, response,)\n+ self._unlocked = (\n+ request,\n+ response,\n+ )\n return response\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -670,16 +668,18 @@ def UNLOCK(self, request, response):\n \n def test_PUT(self):\n class TestContainer(Container):\n-\n def PUT(self, request, response):\n- self._put = (request, response,)\n+ self._put = (\n+ request,\n+ response,\n+ )\n return response\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -687,44 +687,44 @@ def PUT(self, request, response):\n self.assertEqual((request, response), container._put)\n \n def test_MKCOL(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertRaises(MethodNotAllowed, r.MKCOL, request, response)\n \n def test_DELETE(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertRaises(MethodNotAllowed, r.DELETE, request, response)\n \n def test_COPY(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n self.assertRaises(MethodNotAllowed, r.COPY, request, response)\n \n def test_MOVE(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://example.org/site/container\'}\n+ environ={"URL": "http://example.org/site/container"}\n )\n response = request.response\n \n@@ -732,118 +732,102 @@ def test_MOVE(self):\n \n def test_manage_DAVget(self):\n class TestContainer(Container):\n-\n def manage_DAVget(self):\n- return \'data\'\n+ return "data"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n- self.assertEqual(\'data\', r.manage_DAVget())\n+ self.assertEqual("data", r.manage_DAVget())\n \n def test_manage_FTPget(self):\n class TestContainer(Container):\n def manage_FTPget(self):\n- return \'data\'\n+ return "data"\n \n- container = TestContainer(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = TestContainer("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n- self.assertEqual(\'data\', r.manage_FTPget())\n+ self.assertEqual("data", r.manage_FTPget())\n \n def test_listDAVObjects(self):\n- container = Container(\'container\')\n- r = FolderDataResource(\'fdata\', container).__of__(container)\n+ container = Container("container")\n+ r = FolderDataResource("fdata", container).__of__(container)\n \n self.assertEqual([], r.listDAVObjects())\n \n-\n class TestFileRepresentation(MockTestCase):\n-\n def create_dummy(self, **kw):\n return ItemDummy(**kw)\n \n def test_directory_factory(self):\n class TestContainer(Container):\n-\n def manage_addFolder(self, name):\n self._added = name\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n factory = DefaultDirectoryFactory(container)\n \n- factory(\'foo\')\n- self.assertEqual(\'foo\', container._added)\n+ factory("foo")\n+ self.assertEqual("foo", container._added)\n \n def test_file_factory_finder_cruft(self):\n- container = Container(\'container\')\n+ container = Container("container")\n factory = DefaultFileFactory(container)\n \n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'.DS_Store\',\n- \'application/octet-stream\',\n- \'xxx\'\n+ Unauthorized, factory, ".DS_Store", "application/octet-stream", "xxx"\n )\n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'._test\',\n- \'application/octet-stream\',\n- \'xxx\'\n+ Unauthorized, factory, "._test", "application/octet-stream", "xxx"\n )\n \n def test_file_factory_no_ctr(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n from Products.CMFCore.utils import getToolByName\n+\n self.patch_global(getToolByName, return_value=None)\n \n factory = DefaultFileFactory(container)\n \n- self.assertEqual(None, factory(\'test.html\', \'text/html\', \'\'))\n+ self.assertEqual(None, factory("test.html", "text/html", ""))\n \n def test_file_factory_no_fti(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n ctr_mock = Mock()\n ctr_mock.findTypeName = Mock(return_value=None)\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n+ self.mock_tool(ctr_mock, "content_type_registry")\n \n factory = DefaultFileFactory(container)\n \n- self.assertEqual(None, factory(\'test.html\', \'text/html\', \'\'))\n+ self.assertEqual(None, factory("test.html", "text/html", ""))\n \n def test_file_factory_not_allowed(self):\n- container = Container(\'container\')\n- container.portal_type = \'containertype\'\n+ container = Container("container")\n+ container.portal_type = "containertype"\n \n child_fti_mock = Mock()\n child_fti_mock.product = None\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=False)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n factory = DefaultFileFactory(container)\n \n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'test.html\',\n- \'text/html\',\n- \'\'\n+ Unauthorized, factory, "test.html", "text/html", ""\n )\n \n def test_file_factory_construction_not_allowed(self):\n- container = Container(\'container\')\n- container.portal_type = \'containertype\'\n+ container = Container("container")\n+ container.portal_type = "containertype"\n \n child_fti_mock = Mock()\n child_fti_mock.product = None\n@@ -851,180 +835,171 @@ def test_file_factory_construction_not_allowed(self):\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=True)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n factory = DefaultFileFactory(container)\n \n self.assertRaises(\n- Unauthorized,\n- factory,\n- \'test.html\',\n- \'text/html\',\n- \'\'\n+ Unauthorized, factory, "test.html", "text/html", ""\n )\n \n def test_file_factory_factory_method(self):\n result_dummy = self.create_dummy()\n container_mock = Mock()\n- container_mock.invokeFactory = Mock(return_value=\'test-1.html\')\n+ container_mock.invokeFactory = Mock(return_value="test-1.html")\n container_mock._getOb = Mock(return_value=result_dummy)\n container_mock._delObject = Mock()\n child_fti_mock = Mock()\n- child_fti_mock.product = \'FooProduct\'\n+ child_fti_mock.product = "FooProduct"\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n pt_mock.getTypeInfo = Mock(return_value=child_fti_mock)\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n factory = DefaultFileFactory(container_mock)\n \n self.assertEqual(\n- result_dummy,\n- factory(\'test.html\', \'text/html\', \'\')\n+ result_dummy, factory("test.html", "text/html", "")\n )\n \n def test_file_factory_factory_utility(self):\n- result_dummy = self.create_dummy(id=\'test.html\')\n+ result_dummy = self.create_dummy(id="test.html")\n container_mock = Mock()\n child_fti_mock = Mock()\n child_fti_mock.isConstructionAllowed = Mock(return_value=True)\n child_fti_mock.product = None\n- child_fti_mock.factory = \'childtype-factory\'\n+ child_fti_mock.factory = "childtype-factory"\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=True)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n def factory(*args, **kwargs):\n return result_dummy\n- self.mock_utility(factory, IFactory, name=u\'childtype-factory\')\n+\n+ self.mock_utility(factory, IFactory, name=u"childtype-factory")\n \n factory = DefaultFileFactory(container_mock)\n \n self.assertEqual(\n- result_dummy,\n- factory(\'test.html\', \'text/html\', \'\')\n+ result_dummy, factory("test.html", "text/html", "")\n )\n- self.assertEqual(result_dummy.Title(), \'test.html\')\n+ self.assertEqual(result_dummy.Title(), "test.html")\n \n def test_file_factory_content_type_factory_utility(self):\n container_mock = Mock()\n child_fti_mock = Mock()\n child_fti_mock.isConstructionAllowed = Mock(return_value=True)\n- child_fti_mock.getId = Mock(return_value=\'childtype\')\n+ child_fti_mock.getId = Mock(return_value="childtype")\n child_fti_mock.product = None\n- child_fti_mock.factory = \'childtype-factory\'\n+ child_fti_mock.factory = "childtype-factory"\n container_fti_mock = Mock()\n container_fti_mock.allowType = Mock(return_value=True)\n ctr_mock = Mock()\n- ctr_mock.findTypeName = Mock(return_value=\'childtype\')\n+ ctr_mock.findTypeName = Mock(return_value="childtype")\n pt_mock = Mock()\n- pt_mock.getTypeInfo = Mock(\n- side_effect=[child_fti_mock, container_fti_mock])\n- self.mock_tool(ctr_mock, \'content_type_registry\')\n- self.mock_tool(pt_mock, \'portal_types\')\n+ pt_mock.getTypeInfo = Mock(side_effect=[child_fti_mock, container_fti_mock])\n+ self.mock_tool(ctr_mock, "content_type_registry")\n+ self.mock_tool(pt_mock, "portal_types")\n \n def factory(*args, **kwargs):\n return Item(*args, **kwargs)\n- self.mock_utility(factory, IFactory, name=u\'childtype-factory\')\n+\n+ self.mock_utility(factory, IFactory, name=u"childtype-factory")\n \n factory = DefaultFileFactory(container_mock)\n \n- item = factory(\'test.html\', \'text/html\', \'\')\n+ item = factory("test.html", "text/html", "")\n \n- self.assertEqual(\'test.html\', item.id)\n+ self.assertEqual("test.html", item.id)\n \n def test_readfile_mimetype_no_message_no_fields(self):\n-\n class ITest(Interface):\n pass\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = []\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n def test_readfile_mimetype_no_message_no_primary_field(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = []\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n def test_readfile_mimetype_no_message_single_primary_field(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n+\n+ alsoProvides(ITest["body"], IPrimaryField)\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = []\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n def test_readfile_mimetype_no_message_multiple_primary_fields(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n stuff = schema.Bytes()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n- alsoProvides(ITest[\'stuff\'], IPrimaryField)\n+\n+ alsoProvides(ITest["body"], IPrimaryField)\n+ alsoProvides(ITest["stuff"], IPrimaryField)\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'message/rfc822\', readfile.mimeType)\n+ self.assertEqual("message/rfc822", readfile.mimeType)\n \n def test_readfile_mimetype_additional_schemata(self):\n # This is mostly a test that utils.iterSchemata takes\n@@ -1037,8 +1012,9 @@ class ITestAdditional(Interface):\n # Additional behavior on an item\n body = schema.Text()\n stuff = schema.Bytes()\n- alsoProvides(ITestAdditional[\'body\'], IPrimaryField)\n- alsoProvides(ITestAdditional[\'stuff\'], IPrimaryField)\n+\n+ alsoProvides(ITestAdditional["body"], IPrimaryField)\n+ alsoProvides(ITestAdditional["stuff"], IPrimaryField)\n alsoProvides(ITestAdditional, IFormFieldProvider)\n \n class MockBehavior(object):\n@@ -1053,44 +1029,44 @@ def enumerateBehaviors(self):\n yield MockBehavior(ITestAdditional)\n \n SCHEMA_CACHE.clear()\n- fti_mock = DexterityFTI(u\'testtype\')\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n \n- self.mock_adapter(MockBehaviorAssignable, IBehaviorAssignable,\n- (Item, ))\n+ self.mock_adapter(MockBehaviorAssignable, IBehaviorAssignable, (Item,))\n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n- self.assertEqual(\'message/rfc822\', readfile.mimeType)\n+ self.assertEqual("message/rfc822", readfile.mimeType)\n \n def test_readfile_operations(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n \n- fti_mock = DexterityFTI(u\'testtype\')\n+ alsoProvides(ITest["body"], IPrimaryField)\n+\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n \n readfile = DefaultReadFile(item)\n \n message = Message()\n- message[\'title\'] = \'Test title\'\n- message[\'foo\'] = \'10\'\n- message[\'bar\'] = \'xyz\'\n- message.set_payload(\'

body

\')\n+ message["title"] = "Test title"\n+ message["foo"] = "10"\n+ message["bar"] = "xyz"\n+ message.set_payload("

body

")\n \n from plone.rfc822 import constructMessageFromSchemata\n+\n self.patch_global(constructMessageFromSchemata, return_value=message)\n \n body = b"""\\\n@@ -1106,54 +1082,54 @@ class ITest(Interface):\n \n self.assertEqual(body, readfile.read())\n self.assertEqual(69, readfile.size())\n- self.assertEqual(\'utf-8\', readfile.encoding)\n+ self.assertEqual("utf-8", readfile.encoding)\n self.assertEqual(None, readfile.name)\n- self.assertEqual(\'text/plain\', readfile.mimeType)\n+ self.assertEqual("text/plain", readfile.mimeType)\n \n readfile.seek(2)\n self.assertEqual(2, readfile.tell())\n- self.assertEqual(b\'tl\', readfile.read(2))\n+ self.assertEqual(b"tl", readfile.read(2))\n self.assertEqual(4, readfile.tell())\n \n readfile.seek(0, 2)\n self.assertEqual(69, readfile.tell())\n \n readfile.seek(0)\n- self.assertEqual(b\'foo: 10\\n\', readfile.readlines()[1])\n+ self.assertEqual(b"foo: 10\\n", readfile.readlines()[1])\n \n readfile.seek(0)\n- self.assertEqual(b\'foo: 10\\n\', readfile.readlines(100)[1])\n+ self.assertEqual(b"foo: 10\\n", readfile.readlines(100)[1])\n \n readfile.seek(0)\n- self.assertEqual(b\'title: Test title\\n\', readfile.readline())\n+ self.assertEqual(b"title: Test title\\n", readfile.readline())\n \n readfile.seek(0)\n- self.assertEqual(b\'title: Test title\\n\', readfile.readline(100))\n+ self.assertEqual(b"title: Test title\\n", readfile.readline(100))\n \n readfile.seek(0)\n- self.assertEqual(b\'foo: 10\\n\', list(iter(readfile))[1])\n+ self.assertEqual(b"foo: 10\\n", list(iter(readfile))[1])\n \n self.assertEqual(False, readfile.closed)\n readfile.close()\n \n def test_writefile_file_operations(self):\n-\n class ITest(Interface):\n title = schema.TextLine()\n body = schema.Text()\n- alsoProvides(ITest[\'body\'], IPrimaryField)\n \n- fti_mock = DexterityFTI(u\'testtype\')\n+ alsoProvides(ITest["body"], IPrimaryField)\n+\n+ fti_mock = DexterityFTI(u"testtype")\n fti_mock.lookupSchema = Mock(return_value=ITest)\n fti_mock.behaviors = [ITestBehavior.__identifier__]\n \n self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype")\n \n- item = Item(\'item\')\n- item.portal_type = \'testtype\'\n+ item = Item("item")\n+ item.portal_type = "testtype"\n item.title = u"Test title"\n item.foo = 10\n- item.bar = \'xyz\'\n+ item.bar = "xyz"\n item.body = u"

body

"\n \n writefile = DefaultWriteFile(item)\n@@ -1167,21 +1143,22 @@ class ITest(Interface):\n

body

"""\n \n from plone.rfc822 import initializeObjectFromSchemata\n+\n self.patch_global(initializeObjectFromSchemata)\n \n- writefile.mimeType = \'text/plain\'\n- self.assertEqual(\'text/plain\', writefile.mimeType)\n+ writefile.mimeType = "text/plain"\n+ self.assertEqual("text/plain", writefile.mimeType)\n \n- writefile.encoding = \'latin1\'\n- self.assertEqual(\'latin1\', writefile.encoding)\n+ writefile.encoding = "latin1"\n+ self.assertEqual("latin1", writefile.encoding)\n \n- writefile.filename = \'test.html\'\n- self.assertEqual(\'test.html\', writefile.filename)\n+ writefile.filename = "test.html"\n+ self.assertEqual("test.html", writefile.filename)\n \n self.assertEqual(False, writefile.closed)\n self.assertEqual(0, writefile.tell())\n \n- writefile.writelines([\'one\\n\', \'two\'])\n+ writefile.writelines(["one\\n", "two"])\n self.assertEqual(7, writefile.tell())\n \n self.assertRaises(NotImplementedError, writefile.truncate)\n@@ -1198,55 +1175,48 @@ class ITest(Interface):\n self.assertEqual(True, writefile.closed)\n self.assertEqual(69, writefile.tell())\n \n-\n class TestDAVTraversal(MockTestCase):\n-\n def test_no_acquire_dav(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n- outer = Folder(\'outer\')\n- outer._setOb(\'item\', SimpleItem(\'item\'))\n- outer._setOb(\'container\', container)\n+ outer = Folder("outer")\n+ outer._setOb("item", SimpleItem("item"))\n+ outer._setOb("container", container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'PUT\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "PUT"}\n )\n request.maybe_webdav_client = True\n \n- traversal = DexterityPublishTraverse(\n- container.__of__(outer),\n- request\n- )\n+ traversal = DexterityPublishTraverse(container.__of__(outer), request)\n \n- r = traversal.publishTraverse(request, \'item\')\n+ r = traversal.publishTraverse(request, "item")\n \n self.assertTrue(isinstance(r, NullResource))\n self.assertEqual(container, r.aq_parent)\n \n def test_acquire_without_dav(self):\n- container = Container(\'container\')\n+ container = Container("container")\n \n- outer = Folder(\'outer\')\n- outer._setObject(\'item\', SimpleItem(\'item\'))\n- outer._setOb(\'container\', container)\n+ outer = Folder("outer")\n+ outer._setObject("item", SimpleItem("item"))\n+ outer._setOb("container", container)\n \n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'GET\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "GET"}\n )\n request.maybe_webdav_client = False\n \n traversal = DexterityPublishTraverse(container.__of__(outer), request)\n \n- r = traversal.publishTraverse(request, \'item\')\n+ r = traversal.publishTraverse(request, "item")\n \n- self.assertEqual(r.aq_base, outer[\'item\'].aq_base)\n+ self.assertEqual(r.aq_base, outer["item"].aq_base)\n self.assertEqual(container, r.aq_parent)\n \n def test_folder_data_traversal_dav(self):\n- container = Container(\'test\')\n- request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\'}\n- )\n+ container = Container("test")\n+ request = DAVTestRequest(environ={"URL": "http://site/test"})\n request.maybe_webdav_client = True\n \n traversal = DexterityPublishTraverse(container, request)\n@@ -1258,77 +1228,82 @@ def test_folder_data_traversal_dav(self):\n self.assertEqual(container, r.aq_parent)\n \n def test_folder_data_traversal_without_dav(self):\n- container = Container(\'test\')\n- request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\'}\n- )\n+ container = Container("test")\n+ request = DAVTestRequest(environ={"URL": "http://site/test"})\n request.maybe_webdav_client = False\n \n traversal = DexterityPublishTraverse(container, request)\n \n self.assertRaises(\n- Forbidden,\n- traversal.publishTraverse,\n- request,\n- DAV_FOLDER_DATA_ID\n+ Forbidden, traversal.publishTraverse, request, DAV_FOLDER_DATA_ID\n )\n \n def test_browser_default_dav(self):\n class TestContainer(Container):\n-\n def __browser_default__(self, request):\n- return self, (\'foo\',)\n+ return self, ("foo",)\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'PROPFIND\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "PROPFIND"}\n )\n request.maybe_webdav_client = True\n \n traversal = DexterityPublishTraverse(container, request)\n \n- self.assertEqual((container, (),), traversal.browserDefault(request))\n+ self.assertEqual(\n+ (\n+ container,\n+ (),\n+ ),\n+ traversal.browserDefault(request),\n+ )\n \n def test_browser_default_dav_get(self):\n class TestContainer(Container):\n-\n def __browser_default__(self, request):\n- return self, (\'foo\',)\n+ return self, ("foo",)\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'GET\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "GET"}\n )\n request.maybe_webdav_client = True\n \n traversal = DexterityPublishTraverse(container, request)\n \n self.assertEqual(\n- (container, (\'foo\',),),\n- traversal.browserDefault(request)\n+ (\n+ container,\n+ ("foo",),\n+ ),\n+ traversal.browserDefault(request),\n )\n \n def test_browser_default_without_dav(self):\n class TestContainer(Container):\n-\n def __browser_default__(self, request):\n- return self, (\'foo\',)\n+ return self, ("foo",)\n \n- container = TestContainer(\'container\')\n+ container = TestContainer("container")\n request = DAVTestRequest(\n- environ={\'URL\': \'http://site/test\', \'REQUEST_METHOD\': \'PROPFIND\'}\n+ environ={"URL": "http://site/test", "REQUEST_METHOD": "PROPFIND"}\n )\n request.maybe_webdav_client = False\n \n traversal = DexterityPublishTraverse(container, request)\n \n self.assertEqual(\n- (container, (\'foo\',),),\n- traversal.browserDefault(request)\n+ (\n+ container,\n+ ("foo",),\n+ ),\n+ traversal.browserDefault(request),\n )\n \n+\n else:\n- class TestDummy(MockTestCase):\n \n+ class TestDummy(MockTestCase):\n def test_dummy(self):\n pass\ndiff --git a/plone/dexterity/utils.py b/plone/dexterity/utils.py\nindex 87b33f9..745a394 100644\n--- a/plone/dexterity/utils.py\n+++ b/plone/dexterity/utils.py\n@@ -27,18 +27,10 @@\n import six\n \n \n-deprecation.deprecated(\n- \'SchemaNameEncoder\',\n- \'moved to plone.dexterity.schema\')\n-deprecation.deprecated(\n- \'portalTypeToSchemaName\',\n- \'moved to plone.dexterity.schema\')\n-deprecation.deprecated(\n- \'schemaNameToPortalType\',\n- \'moved to plone.dexterity.schema\')\n-deprecation.deprecated(\n- \'splitSchemaName\',\n- \'moved to plone.dexterity.schema\')\n+deprecation.deprecated("SchemaNameEncoder", "moved to plone.dexterity.schema")\n+deprecation.deprecated("portalTypeToSchemaName", "moved to plone.dexterity.schema")\n+deprecation.deprecated("schemaNameToPortalType", "moved to plone.dexterity.schema")\n+deprecation.deprecated("splitSchemaName", "moved to plone.dexterity.schema")\n \n log = logging.getLogger(__name__)\n \n@@ -47,8 +39,7 @@\n \n \n def resolveDottedName(dottedName):\n- """Resolve a dotted name to a real object\n- """\n+ """Resolve a dotted name to a real object"""\n global _dottedCache\n if dottedName not in _dottedCache:\n _dottedCache[dottedName] = resolve(dottedName)\n@@ -91,8 +82,9 @@ def getAdditionalSchemata(context=None, portal_type=None):\n are set, the portal_type might get ignored, depending on which\n code path is taken.\n """\n- log.debug("getAdditionalSchemata with context %r and portal_type %s",\n- context, portal_type)\n+ log.debug(\n+ "getAdditionalSchemata with context %r and portal_type %s", context, portal_type\n+ )\n if context is None and portal_type is None:\n return\n if context:\n@@ -104,9 +96,7 @@ def getAdditionalSchemata(context=None, portal_type=None):\n # Usually an add-form.\n if portal_type is None:\n portal_type = context.portal_type\n- for schema_interface in SCHEMA_CACHE.behavior_schema_interfaces(\n- portal_type\n- ):\n+ for schema_interface in SCHEMA_CACHE.behavior_schema_interfaces(portal_type):\n form_schema = IFormFieldProvider(schema_interface, None)\n if form_schema is not None:\n yield form_schema\n@@ -176,13 +166,12 @@ def addContentToContainer(container, object, checkConstraints=True):\n if not fti.isConstructionAllowed(container):\n raise Unauthorized("Cannot create %s" % object.portal_type)\n \n- if container_fti is not None \\\n- and not container_fti.allowType(object.portal_type):\n- raise ValueError(\n- "Disallowed subobject type: %s" % object.portal_type\n- )\n+ if container_fti is not None and not container_fti.allowType(\n+ object.portal_type\n+ ):\n+ raise ValueError("Disallowed subobject type: %s" % object.portal_type)\n \n- name = getattr(aq_base(object), \'id\', None)\n+ name = getattr(aq_base(object), "id", None)\n name = INameChooser(container).chooseName(name, object)\n object.id = name\n \n@@ -194,35 +183,30 @@ def addContentToContainer(container, object, checkConstraints=True):\n return uuidToObject(uuid)\n \n \n-def createContentInContainer(container, portal_type, checkConstraints=True,\n- **kw):\n+def createContentInContainer(container, portal_type, checkConstraints=True, **kw):\n content = createContent(portal_type, **kw)\n- return addContentToContainer(\n- container,\n- content,\n- checkConstraints=checkConstraints\n- )\n+ return addContentToContainer(container, content, checkConstraints=checkConstraints)\n \n \n def safe_utf8(st):\n if isinstance(st, six.text_type):\n- st = st.encode(\'utf8\')\n+ st = st.encode("utf8")\n return st\n \n \n def safe_unicode(st):\n if isinstance(st, six.binary_type):\n- st = st.decode(\'utf8\')\n+ st = st.decode("utf8")\n return st\n \n \n def datify(in_date):\n """Get a DateTime object from a string (or anything parsable by DateTime,\n- a datetime.date, a datetime.datetime\n+ a datetime.date, a datetime.datetime\n """\n if isinstance(in_date, DateTime):\n return in_date\n- if in_date == \'None\':\n+ if in_date == "None":\n in_date = None\n elif isinstance(in_date, datetime.datetime):\n in_date = DateTime(in_date)\n' +A news/125.feature + +b'diff --git a/news/125.feature b/news/125.feature\nnew file mode 100644\nindex 0000000..3e6515c\n--- /dev/null\n+++ b/news/125.feature\n@@ -0,0 +1 @@\n+Add support for more widget options when working with relation fields.\n\\ No newline at end of file\n' + +Repository: plone.app.z3cform + + +Branch: refs/heads/master +Date: 2021-08-12T07:53:42+02:00 +Author: Philip Bauer (pbauer) +Commit: https://github.com/plone/plone.app.z3cform/commit/62080da5439cc391797ce79d31e72731a501c152 + +Merge pull request #125 from plone/vocabulary-relations + +Add support for more widgets when working with relationfieds + +Files changed: +A news/125.feature +M plone/app/z3cform/configure.zcml +M plone/app/z3cform/converters.py +M plone/app/z3cform/widget.py + +b'diff --git a/news/125.feature b/news/125.feature\nnew file mode 100644\nindex 0000000..3e6515c\n--- /dev/null\n+++ b/news/125.feature\n@@ -0,0 +1 @@\n+Add support for more widget options when working with relation fields.\n\\ No newline at end of file\ndiff --git a/plone/app/z3cform/configure.zcml b/plone/app/z3cform/configure.zcml\nindex cdd0914..cb089e5 100644\n--- a/plone/app/z3cform/configure.zcml\n+++ b/plone/app/z3cform/configure.zcml\n@@ -84,7 +84,13 @@\n \n \n \n+ \n+ \n \n+ \n+ \n \n \n \ndiff --git a/plone/app/z3cform/converters.py b/plone/app/z3cform/converters.py\nindex 6c52101..fae8cb7 100644\n--- a/plone/app/z3cform/converters.py\n+++ b/plone/app/z3cform/converters.py\n@@ -17,7 +17,8 @@\n from z3c.form.converter import BaseDataConverter\n from z3c.form.converter import CollectionSequenceDataConverter\n from z3c.form.converter import SequenceDataConverter\n-from z3c.relationfield.interfaces import IRelationChoice\n+from z3c.form.interfaces import ISequenceWidget\n+from z3c.relationfield.interfaces import IRelation\n from z3c.relationfield.interfaces import IRelationList\n from zope.component import adapter\n from zope.component.hooks import getSite\n@@ -224,7 +225,7 @@ def toFieldValue(self, value):\n return collectionType(untokenized_value)\n \n \n-@adapter(IRelationChoice, IRelatedItemsWidget)\n+@adapter(IRelation, IRelatedItemsWidget)\n class RelationChoiceRelatedItemsWidgetConverter(BaseDataConverter):\n """Data converter for RelationChoice fields using the RelatedItemsWidget.\n """\n@@ -249,6 +250,19 @@ def toFieldValue(self, value):\n return self.field.missing_value\n \n \n+@adapter(IRelation, ISequenceWidget)\n+class RelationChoiceSelectWidgetConverter(RelationChoiceRelatedItemsWidgetConverter):\n+ """Data converter for RelationChoice fields using with SequenceWidgets,\n+ which expect sequence values.\n+ """\n+\n+ def toWidgetValue(self, value):\n+ if not value:\n+ missing = self.field.missing_value\n+ return [] if missing is None else missing\n+ return [IUUID(value)]\n+\n+\n @adapter(ICollection, IRelatedItemsWidget)\n class RelatedItemsDataConverter(BaseDataConverter):\n """Data converter for ICollection fields using the RelatedItemsWidget."""\n@@ -287,7 +301,9 @@ def toFieldValue(self, value):\n collectionType = collectionType[-1]\n \n separator = getattr(self.widget, \'separator\', \';\')\n- value = value.split(separator)\n+ # Some widgets (like checkbox) return lists\n+ if isinstance(value, six.string_types):\n+ value = value.split(separator)\n \n if IRelationList.providedBy(self.field):\n try:\n@@ -311,6 +327,30 @@ def toFieldValue(self, value):\n return collectionType(valueType(v) for v in value)\n \n \n+@adapter(IRelationList, ISequenceWidget)\n+class RelationListSelectWidgetDataConverter(RelatedItemsDataConverter):\n+ """Data converter for RelationChoice fields using with SequenceWidgets,\n+ which expect sequence values.\n+ """\n+\n+ def toWidgetValue(self, value):\n+ """Converts from field value to widget.\n+\n+ :param value: List of catalog brains.\n+ :type value: list\n+\n+ :returns: List of of UID.\n+ :rtype: list\n+ """\n+ if not value:\n+ missing = self.field.missing_value\n+ return [] if missing is None else missing\n+ if IRelationList.providedBy(self.field):\n+ return [IUUID(o) for o in value if o]\n+ else:\n+ return [v for v in value if v]\n+\n+\n @adapter(IList, IQueryStringWidget)\n class QueryStringDataConverter(BaseDataConverter):\n """Data converter for IList."""\ndiff --git a/plone/app/z3cform/widget.py b/plone/app/z3cform/widget.py\nindex b15fd2e..26384c7 100644\n--- a/plone/app/z3cform/widget.py\n+++ b/plone/app/z3cform/widget.py\n@@ -391,13 +391,14 @@ def _view_context(self):\n return view_context\n \n def get_vocabulary(self):\n- if self.vocabulary:\n+ if self.vocabulary and isinstance(self.vocabulary, six.text_type):\n factory = queryUtility(\n IVocabularyFactory,\n self.vocabulary,\n )\n if factory:\n return factory(self._view_context())\n+ return self.vocabulary\n \n def display_items(self):\n if self.value:\n'