summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2017-01-28 11:19:17 +0100
committerChristian Heimes <christian@python.org>2017-01-28 14:51:01 +0100
commitef6c918260b4bd3b58ac2000a1222b34b96f222d (patch)
tree62fbd9d7300fafeb68dadb652a43cc6449dad137
parent0fe313449369ae399ae318c07298d45ea1ae5f0d (diff)
downloaddefusedxml-git-ef6c918260b4bd3b58ac2000a1222b34b96f222d.tar.gz
Fix flake8 violations
-rw-r--r--defusedxml/ElementTree.py20
-rw-r--r--defusedxml/__init__.py5
-rw-r--r--defusedxml/cElementTree.py7
-rw-r--r--defusedxml/common.py8
-rw-r--r--defusedxml/expatbuilder.py2
-rw-r--r--defusedxml/lxml.py14
-rw-r--r--defusedxml/minidom.py12
-rw-r--r--defusedxml/sax.py2
-rw-r--r--defusedxml/xmlrpc.py18
-rw-r--r--setup.py6
-rw-r--r--tests.py25
11 files changed, 79 insertions, 40 deletions
diff --git a/defusedxml/ElementTree.py b/defusedxml/ElementTree.py
index b35962d..41b2ea8 100644
--- a/defusedxml/ElementTree.py
+++ b/defusedxml/ElementTree.py
@@ -8,22 +8,27 @@
from __future__ import print_function, absolute_import
import sys
+from xml.etree.ElementTree import TreeBuilder as _TreeBuilder
+from xml.etree.ElementTree import parse as _parse
+from xml.etree.ElementTree import tostring
+
from .common import PY3
+
+
if PY3:
import importlib
else:
from xml.etree.ElementTree import XMLParser as _XMLParser
from xml.etree.ElementTree import iterparse as _iterparse
from xml.etree.ElementTree import ParseError
-from xml.etree.ElementTree import TreeBuilder as _TreeBuilder
-from xml.etree.ElementTree import parse as _parse
-from xml.etree.ElementTree import tostring
+
from .common import (DTDForbidden, EntitiesForbidden,
ExternalReferenceForbidden, _generate_etree_functions)
__origin__ = "xml.etree.ElementTree"
+
def _get_py3_cls():
"""Python 3.3 hides the pure Python code but defusedxml requires it.
@@ -49,11 +54,13 @@ def _get_py3_cls():
return _XMLParser, _iterparse, ParseError
+
if PY3:
_XMLParser, _iterparse, ParseError = _get_py3_cls()
class DefusedXMLParser(_XMLParser):
+
def __init__(self, html=0, target=None, encoding=None,
forbid_dtd=False, forbid_entities=True,
forbid_external=True):
@@ -96,5 +103,10 @@ class DefusedXMLParser(_XMLParser):
XMLTreeBuilder = XMLParse = DefusedXMLParser
parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser,
- _TreeBuilder, _parse, _iterparse)
+ _TreeBuilder, _parse,
+ _iterparse)
XML = fromstring
+
+
+__all__ = ['XML', 'XMLParse', 'XMLTreeBuilder', 'fromstring', 'iterparse',
+ 'parse', 'tostring']
diff --git a/defusedxml/__init__.py b/defusedxml/__init__.py
index 98a7f14..590a5a9 100644
--- a/defusedxml/__init__.py
+++ b/defusedxml/__init__.py
@@ -11,6 +11,7 @@ from .common import (DefusedXmlException, DTDForbidden, EntitiesForbidden,
ExternalReferenceForbidden, NotSupportedError,
_apply_defusing)
+
def defuse_stdlib():
"""Monkey patch and defuse all stdlib packages
@@ -38,5 +39,7 @@ def defuse_stdlib():
return defused
-__version__ = "0.4.1"
+__version__ = "0.5.0"
+__all__ = ['DefusedXmlException', 'DTDForbidden', 'EntitiesForbidden',
+ 'ExternalReferenceForbidden', 'NotSupportedError']
diff --git a/defusedxml/cElementTree.py b/defusedxml/cElementTree.py
index 0c8779c..cc13689 100644
--- a/defusedxml/cElementTree.py
+++ b/defusedxml/cElementTree.py
@@ -18,8 +18,13 @@ from .common import _generate_etree_functions
__origin__ = "xml.etree.cElementTree"
+
XMLTreeBuilder = XMLParse = DefusedXMLParser
parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser,
- _TreeBuilder, _parse, _iterparse)
+ _TreeBuilder, _parse,
+ _iterparse)
XML = fromstring
+
+__all__ = ['XML', 'XMLParse', 'XMLTreeBuilder', 'fromstring', 'iterparse',
+ 'parse', 'tostring']
diff --git a/defusedxml/common.py b/defusedxml/common.py
index 85a2d9c..668b609 100644
--- a/defusedxml/common.py
+++ b/defusedxml/common.py
@@ -6,7 +6,6 @@
"""Common constants, exceptions and helpe functions
"""
import sys
-from types import MethodType
PY3 = sys.version_info[0] == 3
@@ -14,6 +13,7 @@ PY3 = sys.version_info[0] == 3
class DefusedXmlException(ValueError):
"""Base exception
"""
+
def __repr__(self):
return str(self)
@@ -21,6 +21,7 @@ class DefusedXmlException(ValueError):
class DTDForbidden(DefusedXmlException):
"""Document type definition is forbidden
"""
+
def __init__(self, name, sysid, pubid):
super(DTDForbidden, self).__init__()
self.name = name
@@ -35,6 +36,7 @@ class DTDForbidden(DefusedXmlException):
class EntitiesForbidden(DefusedXmlException):
"""Entity definition is forbidden
"""
+
def __init__(self, name, value, base, sysid, pubid, notation_name):
super(EntitiesForbidden, self).__init__()
self.name = name
@@ -52,6 +54,7 @@ class EntitiesForbidden(DefusedXmlException):
class ExternalReferenceForbidden(DefusedXmlException):
"""Resolving an external reference is forbidden
"""
+
def __init__(self, context, base, sysid, pubid):
super(ExternalReferenceForbidden, self).__init__()
self.context = context
@@ -83,7 +86,7 @@ def _apply_defusing(defused_mod):
def _generate_etree_functions(DefusedXMLParser, _TreeBuilder,
- _parse, _iterparse):
+ _parse, _iterparse):
"""Factory for functions needed by etree, dependent on whether
cElementTree or ElementTree is used."""
@@ -114,5 +117,4 @@ def _generate_etree_functions(DefusedXMLParser, _TreeBuilder,
parser.feed(text)
return parser.close()
-
return parse, iterparse, fromstring
diff --git a/defusedxml/expatbuilder.py b/defusedxml/expatbuilder.py
index d81fd2f..0eb6b91 100644
--- a/defusedxml/expatbuilder.py
+++ b/defusedxml/expatbuilder.py
@@ -49,7 +49,7 @@ class DefusedExpatBuilder(_ExpatBuilder):
if self.forbid_dtd:
parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl
if self.forbid_entities:
- #if self._options.entities:
+ # if self._options.entities:
parser.EntityDeclHandler = self.defused_entity_decl
parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl
if self.forbid_external:
diff --git a/defusedxml/lxml.py b/defusedxml/lxml.py
index 94b497c..7f3ee0b 100644
--- a/defusedxml/lxml.py
+++ b/defusedxml/lxml.py
@@ -40,7 +40,8 @@ class RestrictedElement(_etree.ElementBase):
return self._filter(iterator)
def iterchildren(self, tag=None, reversed=False):
- iterator = super(RestrictedElement, self).iterchildren(tag=tag, reversed=reversed)
+ iterator = super(RestrictedElement, self).iterchildren(
+ tag=tag, reversed=reversed)
return self._filter(iterator)
def iter(self, tag=None, *tags):
@@ -48,11 +49,13 @@ class RestrictedElement(_etree.ElementBase):
return self._filter(iterator)
def iterdescendants(self, tag=None, *tags):
- iterator = super(RestrictedElement, self).iterdescendants(tag=tag, *tags)
+ iterator = super(RestrictedElement,
+ self).iterdescendants(tag=tag, *tags)
return self._filter(iterator)
def itersiblings(self, tag=None, preceding=False):
- iterator = super(RestrictedElement, self).itersiblings(tag=tag, preceding=preceding)
+ iterator = super(RestrictedElement, self).itersiblings(
+ tag=tag, preceding=preceding)
return self._filter(iterator)
def getchildren(self):
@@ -69,8 +72,8 @@ class GlobalParserTLS(threading.local):
"""
parser_config = {
'resolve_entities': False,
- #'remove_comments': True,
- #'remove_pis': True,
+ # 'remove_comments': True,
+ # 'remove_pis': True,
}
element_class = RestrictedElement
@@ -142,6 +145,7 @@ def fromstring(text, parser=None, base_url=None, forbid_dtd=False,
check_docinfo(elementtree, forbid_dtd, forbid_entities)
return rootelement
+
XML = fromstring
diff --git a/defusedxml/minidom.py b/defusedxml/minidom.py
index 1ce6946..0fd8684 100644
--- a/defusedxml/minidom.py
+++ b/defusedxml/minidom.py
@@ -13,6 +13,7 @@ from . import pulldom as _pulldom
__origin__ = "xml.dom.minidom"
+
def parse(file, parser=None, bufsize=None, forbid_dtd=False,
forbid_entities=True, forbid_external=True):
"""Parse a file into a DOM by filename or file object."""
@@ -22,17 +23,18 @@ def parse(file, parser=None, bufsize=None, forbid_dtd=False,
forbid_external=forbid_external)
else:
return _do_pulldom_parse(_pulldom.parse, (file,),
- {'parser': parser, 'bufsize': bufsize,
- 'forbid_dtd': forbid_dtd, 'forbid_entities': forbid_entities,
- 'forbid_external': forbid_external})
+ {'parser': parser, 'bufsize': bufsize,
+ 'forbid_dtd': forbid_dtd, 'forbid_entities': forbid_entities,
+ 'forbid_external': forbid_external})
+
def parseString(string, parser=None, forbid_dtd=False,
forbid_entities=True, forbid_external=True):
"""Parse a file into a DOM from a string."""
if parser is None:
return _expatbuilder.parseString(string, forbid_dtd=forbid_dtd,
- forbid_entities=forbid_entities,
- forbid_external=forbid_external)
+ forbid_entities=forbid_entities,
+ forbid_external=forbid_external)
else:
return _do_pulldom_parse(_pulldom.parseString, (string,),
{'parser': parser, 'forbid_dtd': forbid_dtd,
diff --git a/defusedxml/sax.py b/defusedxml/sax.py
index 4305df0..534d0ca 100644
--- a/defusedxml/sax.py
+++ b/defusedxml/sax.py
@@ -14,6 +14,7 @@ from . import expatreader
__origin__ = "xml.sax"
+
def parse(source, handler, errorHandler=_ErrorHandler(), forbid_dtd=False,
forbid_entities=True, forbid_external=True):
parser = make_parser()
@@ -43,5 +44,6 @@ def parseString(string, handler, errorHandler=_ErrorHandler(),
inpsrc.setByteStream(BytesIO(string))
parser.parse(inpsrc)
+
def make_parser(parser_list=[]):
return expatreader.create_parser()
diff --git a/defusedxml/xmlrpc.py b/defusedxml/xmlrpc.py
index 7160d3c..2a456e6 100644
--- a/defusedxml/xmlrpc.py
+++ b/defusedxml/xmlrpc.py
@@ -20,14 +20,14 @@ if PY3:
from xmlrpc import client as xmlrpc_client
from xmlrpc import server as xmlrpc_server
from xmlrpc.client import gzip_decode as _orig_gzip_decode
- from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse
+ from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse
else:
__origin__ = "xmlrpclib"
from xmlrpclib import ExpatParser
import xmlrpclib as xmlrpc_client
xmlrpc_server = None
from xmlrpclib import gzip_decode as _orig_gzip_decode
- from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse
+ from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse
try:
import gzip
@@ -39,7 +39,8 @@ except ImportError:
# Also used to limit maximum amount of gzip decoded data in order to prevent
# decompression bombs
# A value of -1 or smaller disables the limit
-MAX_DATA = 30 * 1024 * 1024 # 30 MB
+MAX_DATA = 30 * 1024 * 1024 # 30 MB
+
def defused_gzip_decode(data, limit=None):
"""gzip encoded data -> unencoded data
@@ -53,7 +54,7 @@ def defused_gzip_decode(data, limit=None):
f = io.BytesIO(data)
gzf = gzip.GzipFile(mode="rb", fileobj=f)
try:
- if limit < 0: # no limit
+ if limit < 0: # no limit
decoded = gzf.read()
else:
decoded = gzf.read(limit + 1)
@@ -70,13 +71,14 @@ class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object):
"""a file-like object to decode a response encoded with the gzip
method, as described in RFC 1952.
"""
+
def __init__(self, response, limit=None):
- #response doesn't support tell() and read(), required by
- #GzipFile
+ # response doesn't support tell() and read(), required by
+ # GzipFile
if not gzip:
raise NotImplementedError
self.limit = limit = limit if limit is not None else MAX_DATA
- if limit < 0: # no limit
+ if limit < 0: # no limit
data = response.read()
self.readlength = None
else:
@@ -105,6 +107,7 @@ class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object):
class DefusedExpatParser(ExpatParser):
+
def __init__(self, target, forbid_dtd=False, forbid_entities=True,
forbid_external=True):
ExpatParser.__init__(self, target)
@@ -145,6 +148,7 @@ def monkey_patch():
if xmlrpc_server:
xmlrpc_server.gzip_decode = defused_gzip_decode
+
def unmonkey_patch():
xmlrpc_client.FastParser = None
xmlrpc_client.GzipDecodedResponse = _OrigGzipDecodedResponse
diff --git a/setup.py b/setup.py
index 5e652aa..4e49471 100644
--- a/setup.py
+++ b/setup.py
@@ -8,12 +8,16 @@ from setuptools import setup
import defusedxml
+
class PyTest(Command):
user_options = []
+
def initialize_options(self):
pass
+
def finalize_options(self):
pass
+
def run(self):
errno = subprocess.call([sys.executable, "tests.py"])
raise SystemExit(errno)
@@ -25,6 +29,7 @@ with open("README.txt") as f:
with open("CHANGES.txt") as f:
long_description.append(f.read())
+
setup(
name="defusedxml",
version=defusedxml.__version__,
@@ -56,4 +61,3 @@ setup(
"Topic :: Text Processing :: Markup :: XML",
],
)
-
diff --git a/tests.py b/tests.py
index b297200..145172c 100644
--- a/tests.py
+++ b/tests.py
@@ -3,7 +3,6 @@ import os
import sys
import unittest
import io
-import re
from xml.sax.saxutils import XMLGenerator
from xml.sax import SAXParseException
@@ -11,7 +10,7 @@ from pyexpat import ExpatError
from defusedxml import cElementTree, ElementTree, minidom, pulldom, sax, xmlrpc
from defusedxml import defuse_stdlib
-from defusedxml import (DefusedXmlException, DTDForbidden, EntitiesForbidden,
+from defusedxml import (DTDForbidden, EntitiesForbidden,
ExternalReferenceForbidden, NotSupportedError)
from defusedxml.common import PY3
@@ -141,7 +140,6 @@ class BaseTests(DefusedTestCase):
self.assertRaises(DTDForbidden, self.iterparse,
self.xml_dtd, forbid_dtd=True)
-
def test_dtd_with_external_ref(self):
if self.dtd_external_ref:
self.assertRaises(self.external_ref_exception, self.parse,
@@ -172,9 +170,8 @@ class BaseTests(DefusedTestCase):
class TestDefusedElementTree(BaseTests):
module = ElementTree
-
- ## etree doesn't do external ref lookup
- #external_ref_exception = ElementTree.ParseError
+ # etree doesn't do external ref lookup
+ # external_ref_exception = ElementTree.ParseError
cyclic_error = ElementTree.ParseError
@@ -199,7 +196,6 @@ class TestDefusedMinidom(BaseTests):
cyclic_error = ExpatError
-
iterparse = None
def parse(self, xmlfile, **kwargs):
@@ -376,6 +372,7 @@ class TestDefusedLxml(BaseTests):
class XmlRpcTarget(object):
+
def __init__(self):
self._data = []
@@ -394,8 +391,10 @@ class XmlRpcTarget(object):
def end(self, tag):
self._data.append("</%s>" % tag)
+
class TestXmlRpc(DefusedTestCase):
module = xmlrpc
+
def parse(self, xmlfile, **kwargs):
target = XmlRpcTarget()
parser = self.module.DefusedExpatParser(target, **kwargs)
@@ -419,7 +418,7 @@ class TestXmlRpc(DefusedTestCase):
self.assertRaises(DTDForbidden, self.parse, self.xml_dtd,
forbid_dtd=True)
- #def test_xmlrpc_unpatched(self):
+ # def test_xmlrpc_unpatched(self):
# for fname in (self.xml_external, self.xml_dtd):
# print(self.parse_unpatched(fname))
@@ -431,6 +430,7 @@ class TestXmlRpc(DefusedTestCase):
class TestDefusedGzip(DefusedTestCase):
+
def get_gzipped(self, length):
f = io.BytesIO()
gzf = gzip.GzipFile(mode="wb", fileobj=f)
@@ -452,11 +452,11 @@ class TestDefusedGzip(DefusedTestCase):
def test_defused_gzip_decode(self):
data = self.get_gzipped(4096).getvalue()
result = xmlrpc.defused_gzip_decode(data)
- self.assertEqual(result, b"d" *4096)
+ self.assertEqual(result, b"d" * 4096)
result = xmlrpc.defused_gzip_decode(data, -1)
- self.assertEqual(result, b"d" *4096)
+ self.assertEqual(result, b"d" * 4096)
result = xmlrpc.defused_gzip_decode(data, 4096)
- self.assertEqual(result, b"d" *4096)
+ self.assertEqual(result, b"d" * 4096)
with self.assertRaises(ValueError):
result = xmlrpc.defused_gzip_decode(data, 4095)
with self.assertRaises(ValueError):
@@ -467,7 +467,7 @@ class TestDefusedGzip(DefusedTestCase):
response = self.get_gzipped(4096)
data = self.decode_response(response)
- self.assertEqual(data, b"d" *4096)
+ self.assertEqual(data, b"d" * 4096)
with self.assertRaises(ValueError):
response = self.get_gzipped(4096)
@@ -496,6 +496,7 @@ def test_main():
suite.addTests(unittest.makeSuite(TestDefusedGzip))
return suite
+
if __name__ == "__main__":
suite = test_main()
result = unittest.TextTestRunner(verbosity=1).run(suite)