From b24cd055ecb3eea9a15405a6ca72dafc739e6531 Mon Sep 17 00:00:00 2001 From: James Sexton Date: Sat, 30 Sep 2017 02:10:31 -0500 Subject: bpo-30806 netrc.__repr__() is broken for writing to file (GH-2491) netrc file format doesn't support quotes and escapes. See https://linux.die.net/man/5/netrc --- Lib/netrc.py | 12 ++++++------ Lib/test/test_netrc.py | 9 ++++++--- Misc/NEWS.d/next/Library/2017-09-29.bpo-30806.lP5GrH.rst | 1 + 3 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-09-29.bpo-30806.lP5GrH.rst diff --git a/Lib/netrc.py b/Lib/netrc.py index aa8eea3..baf8f1d 100644 --- a/Lib/netrc.py +++ b/Lib/netrc.py @@ -127,15 +127,15 @@ class netrc: rep = "" for host in self.hosts.keys(): attrs = self.hosts[host] - rep = rep + "machine "+ host + "\n\tlogin " + repr(attrs[0]) + "\n" + rep += f"machine {host}\n\tlogin {attrs[0]}\n" if attrs[1]: - rep = rep + "account " + repr(attrs[1]) - rep = rep + "\tpassword " + repr(attrs[2]) + "\n" + rep += f"\taccount {attrs[1]}\n" + rep += f"\tpassword {attrs[2]}\n" for macro in self.macros.keys(): - rep = rep + "macdef " + macro + "\n" + rep += f"macdef {macro}\n" for line in self.macros[macro]: - rep = rep + line - rep = rep + "\n" + rep += line + rep += "\n" return rep if __name__ == '__main__': diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index 60a3ec9..ca6f27d 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -1,7 +1,6 @@ -import netrc, os, unittest, sys, textwrap +import netrc, os, unittest, sys, tempfile, textwrap from test import support -temp_filename = support.TESTFN class NetrcTestCase(unittest.TestCase): @@ -10,7 +9,8 @@ class NetrcTestCase(unittest.TestCase): mode = 'w' if sys.platform != 'cygwin': mode += 't' - with open(temp_filename, mode) as fp: + temp_fd, temp_filename = tempfile.mkstemp() + with os.fdopen(temp_fd, mode=mode) as fp: fp.write(test_data) self.addCleanup(os.unlink, temp_filename) return netrc.netrc(temp_filename) @@ -24,6 +24,9 @@ class NetrcTestCase(unittest.TestCase): ('log1', 'acct1', 'pass1')) self.assertEqual(nrc.hosts['default'], ('log2', None, 'pass2')) + nrc2 = self.make_nrc(nrc.__repr__()) + self.assertEqual(nrc.hosts, nrc2.hosts) + def test_macros(self): nrc = self.make_nrc("""\ macdef macro1 diff --git a/Misc/NEWS.d/next/Library/2017-09-29.bpo-30806.lP5GrH.rst b/Misc/NEWS.d/next/Library/2017-09-29.bpo-30806.lP5GrH.rst new file mode 100644 index 0000000..afad1b2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-29.bpo-30806.lP5GrH.rst @@ -0,0 +1 @@ +Fix the string representation of a netrc object. -- cgit v0.12