mirror of https://github.com/python/cpython
gh-66515: mailbox.MH now supports folders withou the ".mh_sequences" file (GH-804)
(for example Claws Mail IMAP-cache folders).
This commit is contained in:
parent
b5dc0f83ad
commit
e87cadc1ce
|
@ -644,6 +644,10 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
|
||||||
:class:`!MH` instances have all of the methods of :class:`Mailbox` in addition
|
:class:`!MH` instances have all of the methods of :class:`Mailbox` in addition
|
||||||
to the following:
|
to the following:
|
||||||
|
|
||||||
|
.. versionchanged:: 3.13
|
||||||
|
|
||||||
|
Supported folders that don't contain a :file:`.mh_sequences` file.
|
||||||
|
|
||||||
|
|
||||||
.. method:: list_folders()
|
.. method:: list_folders()
|
||||||
|
|
||||||
|
|
|
@ -1198,7 +1198,11 @@ class MH(Mailbox):
|
||||||
def get_sequences(self):
|
def get_sequences(self):
|
||||||
"""Return a name-to-key-list dictionary to define each sequence."""
|
"""Return a name-to-key-list dictionary to define each sequence."""
|
||||||
results = {}
|
results = {}
|
||||||
with open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII') as f:
|
try:
|
||||||
|
f = open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII')
|
||||||
|
except FileNotFoundError:
|
||||||
|
return results
|
||||||
|
with f:
|
||||||
all_keys = set(self.keys())
|
all_keys = set(self.keys())
|
||||||
for line in f:
|
for line in f:
|
||||||
try:
|
try:
|
||||||
|
@ -1221,9 +1225,8 @@ class MH(Mailbox):
|
||||||
|
|
||||||
def set_sequences(self, sequences):
|
def set_sequences(self, sequences):
|
||||||
"""Set sequences using the given name-to-key-list dictionary."""
|
"""Set sequences using the given name-to-key-list dictionary."""
|
||||||
f = open(os.path.join(self._path, '.mh_sequences'), 'r+', encoding='ASCII')
|
f = open(os.path.join(self._path, '.mh_sequences'), 'w', encoding='ASCII')
|
||||||
try:
|
try:
|
||||||
os.close(os.open(f.name, os.O_WRONLY | os.O_TRUNC))
|
|
||||||
for name, keys in sequences.items():
|
for name, keys in sequences.items():
|
||||||
if len(keys) == 0:
|
if len(keys) == 0:
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -1347,6 +1347,19 @@ class TestMH(TestMailbox, unittest.TestCase):
|
||||||
self._box.remove(key1)
|
self._box.remove(key1)
|
||||||
self.assertEqual(self._box.get_sequences(), {'flagged':[key0]})
|
self.assertEqual(self._box.get_sequences(), {'flagged':[key0]})
|
||||||
|
|
||||||
|
self._box.set_sequences({'foo':[key0]})
|
||||||
|
self.assertEqual(self._box.get_sequences(), {'foo':[key0]})
|
||||||
|
|
||||||
|
def test_no_dot_mh_sequences_file(self):
|
||||||
|
path = os.path.join(self._path, 'foo.bar')
|
||||||
|
os.mkdir(path)
|
||||||
|
box = self._factory(path)
|
||||||
|
self.assertEqual(os.listdir(path), [])
|
||||||
|
self.assertEqual(box.get_sequences(), {})
|
||||||
|
self.assertEqual(os.listdir(path), [])
|
||||||
|
box.set_sequences({})
|
||||||
|
self.assertEqual(os.listdir(path), ['.mh_sequences'])
|
||||||
|
|
||||||
def test_issue2625(self):
|
def test_issue2625(self):
|
||||||
msg0 = mailbox.MHMessage(self._template % 0)
|
msg0 = mailbox.MHMessage(self._template % 0)
|
||||||
msg0.add_sequence('foo')
|
msg0.add_sequence('foo')
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
:class:`mailbox.MH` now supports folders that do not contain a
|
||||||
|
``.mh_sequences`` file (e.g. Claws Mail IMAP-cache folders). Patch by Serhiy
|
||||||
|
Storchaka.
|
Loading…
Reference in New Issue