From: <pj...@us...> - 2010-04-10 02:13:18
|
Revision: 7012 http://jython.svn.sourceforge.net/jython/?rev=7012&view=rev Author: pjenvey Date: 2010-04-10 02:13:10 +0000 (Sat, 10 Apr 2010) Log Message: ----------- close file handles fixes #1479 Modified Paths: -------------- trunk/jython/Lib/test/test_xml_etree_jy.py trunk/jython/Lib/xml/etree/ElementTree.py trunk/jython/NEWS Modified: trunk/jython/Lib/test/test_xml_etree_jy.py =================================================================== --- trunk/jython/Lib/test/test_xml_etree_jy.py 2010-04-10 02:09:19 UTC (rev 7011) +++ trunk/jython/Lib/test/test_xml_etree_jy.py 2010-04-10 02:13:10 UTC (rev 7012) @@ -750,5 +750,22 @@ Entity name: entity """ +def test_close_files(): + # http://bugs.jython.org/issue1479 + """ + >>> import os + >>> from test import test_support + >>> from xml.etree import ElementTree as ET + + >>> ET.ElementTree(ET.XML('<test/>')).write(test_support.TESTFN) + >>> os.remove(test_support.TESTFN) + + >>> fp = open(test_support.TESTFN, 'w') + >>> fp.write('<test/>') + >>> fp.close() + >>> tree = ET.parse(test_support.TESTFN) + >>> os.remove(test_support.TESTFN) + """ + if __name__ == "__main__": doctest.testmod() Modified: trunk/jython/Lib/xml/etree/ElementTree.py =================================================================== --- trunk/jython/Lib/xml/etree/ElementTree.py 2010-04-10 02:09:19 UTC (rev 7011) +++ trunk/jython/Lib/xml/etree/ElementTree.py 2010-04-10 02:13:10 UTC (rev 7012) @@ -575,17 +575,22 @@ # @defreturn Element def parse(self, source, parser=None): - if not hasattr(source, "read"): + managed_file = not hasattr(source, "read") + if managed_file: source = open(source, "rb") - if not parser: - parser = XMLTreeBuilder() - while 1: - data = source.read(32768) - if not data: - break - parser.feed(data) - self._root = parser.close() - return self._root + try: + if not parser: + parser = XMLTreeBuilder() + while 1: + data = source.read(32768) + if not data: + break + parser.feed(data) + self._root = parser.close() + return self._root + finally: + if managed_file: + source.close() ## # Creates a tree iterator for the root element. The iterator loops @@ -654,13 +659,18 @@ def write(self, file, encoding="us-ascii"): assert self._root is not None - if not hasattr(file, "write"): + managed_file = not hasattr(file, "write") + if managed_file: file = open(file, "wb") - if not encoding: - encoding = "us-ascii" - elif encoding != "utf-8" and encoding != "us-ascii": - file.write("<?xml version='1.0' encoding='%s'?>\n" % encoding) - self._write(file, self._root, encoding, {}) + try: + if not encoding: + encoding = "us-ascii" + elif encoding != "utf-8" and encoding != "us-ascii": + file.write("<?xml version='1.0' encoding='%s'?>\n" % encoding) + self._write(file, self._root, encoding, {}) + finally: + if managed_file: + file.close() def _write(self, file, node, encoding, namespaces): # write XML to file @@ -874,7 +884,8 @@ class iterparse: def __init__(self, source, events=None): - if not hasattr(source, "read"): + self._managed_file = not hasattr(source, "read") + if self._managed_file: source = open(source, "rb") self._file = source self._events = [] @@ -938,6 +949,8 @@ else: self._root = self._parser.close() self._parser = None + if self._managed_file: + self._file.close() else: self._index = self._index + 1 return item Modified: trunk/jython/NEWS =================================================================== --- trunk/jython/NEWS 2010-04-10 02:09:19 UTC (rev 7011) +++ trunk/jython/NEWS 2010-04-10 02:13:10 UTC (rev 7012) @@ -25,6 +25,7 @@ - [ 1517 ] TypeError: get_referrers - [ 1502 ] string-escape codec incorrect - [ 1534 ] new style object __dict__[name] ignored + - [ 1479 ] xml parser file lock - Fix runtime issues during exitfuncs triggered via SystemRestart (such as during Django or Pylons development mode reloading) - Fix pickling of collections.defaultdict objects This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |