Added support for negative indexes to PurePath.parents (GH-21799)

This commit also fixes up some of the overlapping documentation changed
in bpo-35498, which added support for indexing with slices.

Fixes bpo-21041.
https://bugs.python.org/issue21041

Co-authored-by: Paul Ganssle <p.ganssle@gmail.com>
Co-authored-by: RĂ©mi Lapeyre <remi.lapeyre@henki.fr>
diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst
index 2071e7e..2bbf3aa 100644
--- a/Doc/library/pathlib.rst
+++ b/Doc/library/pathlib.rst
@@ -337,7 +337,7 @@
       PureWindowsPath('c:/')
 
    .. versionchanged:: 3.10
-      Slice support was added.
+      The parents sequence now supports :term:`slices <slice>` and negative index values.
 
 .. data:: PurePath.parent
 
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst
index ce66b1d..f3e433a 100644
--- a/Doc/whatsnew/3.10.rst
+++ b/Doc/whatsnew/3.10.rst
@@ -247,9 +247,13 @@
 pathlib
 -------
 
-Added slice support to :meth:`~pathlib.Path.parents`.
+Added slice support to :attr:`PurePath.parents <pathlib.PurePath.parents>`.
 (Contributed by Joshua Cannon in :issue:`35498`)
 
+Added negative indexing support to :attr:`PurePath.parents
+<pathlib.PurePath.parents>`.
+(Contributed by Yaroslav Pankovych in :issue:`21041`)
+
 py_compile
 ----------
 
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index af31039..531a699 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -632,7 +632,8 @@
     def __getitem__(self, idx):
         if isinstance(idx, slice):
             return tuple(self[i] for i in range(*idx.indices(len(self))))
-        if idx < 0 or idx >= len(self):
+
+        if idx >= len(self) or idx < -len(self):
             raise IndexError(idx)
         return self._pathcls._from_parsed_parts(self._drv, self._root,
                                                 self._parts[:-idx - 1])
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index f145179..5e5e065 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -440,6 +440,9 @@
         self.assertEqual(par[0], P('a/b'))
         self.assertEqual(par[1], P('a'))
         self.assertEqual(par[2], P('.'))
+        self.assertEqual(par[-1], P('.'))
+        self.assertEqual(par[-2], P('a'))
+        self.assertEqual(par[-3], P('a/b'))
         self.assertEqual(par[0:1], (P('a/b'),))
         self.assertEqual(par[:2], (P('a/b'), P('a')))
         self.assertEqual(par[:-1], (P('a/b'), P('a')))
@@ -448,7 +451,7 @@
         self.assertEqual(par[::-1], (P('.'), P('a'), P('a/b')))
         self.assertEqual(list(par), [P('a/b'), P('a'), P('.')])
         with self.assertRaises(IndexError):
-            par[-1]
+            par[-4]
         with self.assertRaises(IndexError):
             par[3]
         with self.assertRaises(TypeError):
diff --git a/Misc/ACKS b/Misc/ACKS
index 16bc42f..2533490 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1283,6 +1283,7 @@
 Richard Oudkerk
 Russel Owen
 Joonas Paalasmaa
+Yaroslav Pankovych
 Martin Packman
 Elisha Paine
 Shriphani Palakodety
diff --git a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst
index fb24ce0..1ab0093 100644
--- a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst
+++ b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst
@@ -1 +1 @@
-Add slice support to :meth:`~pathlib.Path.parents`.
+Add slice support to :attr:`pathlib.PurePath.parents`.
diff --git a/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst b/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst
new file mode 100644
index 0000000..4f14fd3
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst
@@ -0,0 +1 @@
+:attr:`pathlib.PurePath.parents` now supports negative indexing. Patch contributed by Yaroslav Pankovych.