From 8a905b4608ac506f584a4e38b387e1f0a221ff18 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Sat, 2 Nov 2024 00:46:41 +0900 Subject: [PATCH 01/20] Update turtle.py Update RawTurtle.clone() method. 1) moved self._newLine(self._drawing) after deepcopy() 2) added q.items.append(q.currentLineItem) after q.currentLineItem = screen._createline() Reason for 1): When clear method is called on the cloned Turtle object, the method also deletes the first line of the original Turtle object which is drawn after cloning. Reason for 2): When clear method is called on the cloned Turtle object, the method does not delete the first line of the cloned Turtle object which is drawn after cloning --- Lib/turtle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/turtle.py b/Lib/turtle.py index 8a5801f2efe625..52b0d697a46980 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2812,13 +2812,13 @@ def clone(self): joe = mick.clone() """ screen = self.screen - self._newLine(self._drawing) turtle = self.turtle self.screen = None self.turtle = None # too make self deepcopy-able q = deepcopy(self) + self._newLine(self._drawing) self.screen = screen self.turtle = turtle @@ -2836,6 +2836,7 @@ def clone(self): q.turtle._item = [screen._createpoly() for item in screen._shapes[self.turtle.shapeIndex]._data] q.currentLineItem = screen._createline() + q.items.append(q.currentLineItem) q._update() return q From 46a5d87dce5e2f857fe0c8e686334cbcbfa83169 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:08:13 +0000 Subject: [PATCH 02/20] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst diff --git a/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst b/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst new file mode 100644 index 00000000000000..e9038e015b49b0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst @@ -0,0 +1 @@ +Fix the turtle module From cb60c53412db2adc99a5bde121c9013543d72e6e Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:47:02 +0900 Subject: [PATCH 03/20] Update Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst Co-authored-by: Nadeshiko Manju --- .../next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst b/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst index e9038e015b49b0..53b9a85adea73d 100644 --- a/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst +++ b/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst @@ -1 +1 @@ -Fix the turtle module +Fix :mod:`turtle` clone() items management when clearing cloned turtle items From 5e089e3f4c7198c28991efc5995d5b722663c5b5 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Thu, 7 Nov 2024 02:39:39 +0900 Subject: [PATCH 04/20] Update turtle.py moved self._newLine(self._drawing) to original position changed q.items.append(q.currentLineItem) to q.items[-1] = q.currentLineItem --- Lib/turtle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/turtle.py b/Lib/turtle.py index 52b0d697a46980..7c85551db6b76a 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2812,14 +2812,14 @@ def clone(self): joe = mick.clone() """ screen = self.screen + self._newLine(self._drawing) turtle = self.turtle self.screen = None self.turtle = None # too make self deepcopy-able q = deepcopy(self) - self._newLine(self._drawing) - + self.screen = screen self.turtle = turtle @@ -2836,7 +2836,7 @@ def clone(self): q.turtle._item = [screen._createpoly() for item in screen._shapes[self.turtle.shapeIndex]._data] q.currentLineItem = screen._createline() - q.items.append(q.currentLineItem) + q.items[-1] = q.currentLineItem q._update() return q From a081edf91455f04e79cd70ba2d02bd6e53732a51 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 6 Nov 2024 23:33:14 -0500 Subject: [PATCH 05/20] Update Lib/turtle.py --- Lib/turtle.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/turtle.py b/Lib/turtle.py index 7c85551db6b76a..08ab7e62bfada1 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2819,7 +2819,6 @@ def clone(self): self.turtle = None # too make self deepcopy-able q = deepcopy(self) - self.screen = screen self.turtle = turtle From f26a80ce5b1cdf670aba54aa9581d7e284f1295c Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 6 Nov 2024 23:33:51 -0500 Subject: [PATCH 06/20] Update Lib/turtle.py --- Lib/turtle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/turtle.py b/Lib/turtle.py index 08ab7e62bfada1..9c05a438704421 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2819,6 +2819,7 @@ def clone(self): self.turtle = None # too make self deepcopy-able q = deepcopy(self) + self.screen = screen self.turtle = turtle From c84e6a06fcb4fc4e9e9d24c01c71aa62e26c8179 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Wed, 13 Nov 2024 23:50:44 +0900 Subject: [PATCH 07/20] Update turtle.rst added a unit test that fails without the patch and passes with it --- Doc/library/turtle.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 8eb4f8271fcfae..7ce87a5fe85f57 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1690,6 +1690,20 @@ Special Turtle methods >>> mick = Turtle() >>> joe = mick.clone() + .. doctest:: + :skipif: _tkinter is None + + >>> mick = Turtle() + >>> mick.currentLineItem + 4 + >>> mick.items + [4] + >>> joe = mick.clone() + >>> joe.currentLineItem + 7 + >>> joe.items + [7] + .. function:: getturtle() getpen() From 6bfbbe435c140d8d26ff29ae1920b7abf888238f Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Wed, 13 Nov 2024 23:55:50 +0900 Subject: [PATCH 08/20] Update turtle.rst revert change --- Doc/library/turtle.rst | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 7ce87a5fe85f57..8eb4f8271fcfae 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1690,20 +1690,6 @@ Special Turtle methods >>> mick = Turtle() >>> joe = mick.clone() - .. doctest:: - :skipif: _tkinter is None - - >>> mick = Turtle() - >>> mick.currentLineItem - 4 - >>> mick.items - [4] - >>> joe = mick.clone() - >>> joe.currentLineItem - 7 - >>> joe.items - [7] - .. function:: getturtle() getpen() From bb0b1ff3adb2a5f8519a34f1249a20bc3e78a654 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Thu, 14 Nov 2024 00:11:27 +0900 Subject: [PATCH 09/20] Update test_turtle.py Added a unittest that fails without the patch and passes with it. --- Lib/test/test_turtle.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index c75a002a89b4c4..bcdbb4b3abf6e6 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -465,6 +465,13 @@ def test_teleport(self): tpen.teleport(-100, -100, fill_gap=fill_gap_value) self.assertTrue(tpen.isdown()) +class TestRawTurtle(unittest.TestCase): + def test_clone(self): + a_turtle = self.Turtle() + another_turtle = a_turtle.clone() + self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) + self.assertFalse(a_turtle.currentLineItem in another_turtle.items) + class TestTurtleScreen(unittest.TestCase): def test_save_raises_if_wrong_extension(self) -> None: From 1c62794488ca7fa0b3e5752c03ab5c11ad071b45 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 08:22:28 +0900 Subject: [PATCH 10/20] Update test_turtle.py TestRawTurtle.test_clone(): copied screen from TestTurtleScreen.test_save_raises_if_wrong_extension --- Lib/test/test_turtle.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index bcdbb4b3abf6e6..40d34f7bfa7860 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -467,8 +467,9 @@ def test_teleport(self): class TestRawTurtle(unittest.TestCase): def test_clone(self): - a_turtle = self.Turtle() - another_turtle = a_turtle.clone() + screen = unittest.mock.Mock() + rawturtle = turtle.RawTurtle(screen) + another_turtle = rawturtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) self.assertFalse(a_turtle.currentLineItem in another_turtle.items) From f71a9ba88fe89806fa148a11804a9211820ebef2 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 11:22:33 +0900 Subject: [PATCH 11/20] Update test_turtle.py TestRawTurtle.test_clone(): screen = Screen() as in Turtle class --- Lib/test/test_turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 40d34f7bfa7860..47f15f4eb1a4ee 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -467,7 +467,7 @@ def test_teleport(self): class TestRawTurtle(unittest.TestCase): def test_clone(self): - screen = unittest.mock.Mock() + screen = Screen() rawturtle = turtle.RawTurtle(screen) another_turtle = rawturtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) From bca9fdf72a3b224ad30ae56c95ac0ffb56732769 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:02:52 +0900 Subject: [PATCH 12/20] Update test_turtle.py Screen belongs to turtle namespace --- Lib/test/test_turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 47f15f4eb1a4ee..45d53fd9220fea 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -467,7 +467,7 @@ def test_teleport(self): class TestRawTurtle(unittest.TestCase): def test_clone(self): - screen = Screen() + screen = turtle.Screen() rawturtle = turtle.RawTurtle(screen) another_turtle = rawturtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) From 532a8c6fbef600a73994694d3a0d43790846753c Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:20:50 +0900 Subject: [PATCH 13/20] Update test_turtle.py check variable name --- Lib/test/test_turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 45d53fd9220fea..699b6c8f429026 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -471,7 +471,7 @@ def test_clone(self): rawturtle = turtle.RawTurtle(screen) another_turtle = rawturtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) - self.assertFalse(a_turtle.currentLineItem in another_turtle.items) + self.assertFalse(rawturtle.currentLineItem in another_turtle.items) class TestTurtleScreen(unittest.TestCase): From ef71dd6f26cfa27af50b0744816a743e0dbe0baf Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 21:24:04 +0900 Subject: [PATCH 14/20] Update test_turtle.py handling _tkinter.TclError --- Lib/test/test_turtle.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 699b6c8f429026..d83d7136b66d14 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -466,9 +466,14 @@ def test_teleport(self): self.assertTrue(tpen.isdown()) class TestRawTurtle(unittest.TestCase): - def test_clone(self): - screen = turtle.Screen() - rawturtle = turtle.RawTurtle(screen) + def setUp(self): + try: + self.screen = turtle.Screen() + except _tkinter.TclError: + self.skipTest() # cannot instantiate RawTurtle without a screen + + def test_clone(self): + rawturtle = turtle.RawTurtle(self.screen) another_turtle = rawturtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) self.assertFalse(rawturtle.currentLineItem in another_turtle.items) From fddab963a913ec2f126c5d01d9fb59966c85e960 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 21:41:07 +0900 Subject: [PATCH 15/20] Update test_turtle.py correct qualified name of TclError --- Lib/test/test_turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index d83d7136b66d14..ae511b6cd84798 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -469,7 +469,7 @@ class TestRawTurtle(unittest.TestCase): def setUp(self): try: self.screen = turtle.Screen() - except _tkinter.TclError: + except turtle.TK.TclError: self.skipTest() # cannot instantiate RawTurtle without a screen def test_clone(self): From 954e0c419a9a197ac93b712d4311cd388f8c6271 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:10:52 +0900 Subject: [PATCH 16/20] Update test_turtle.py raise SkipTest to skip test instead of skipTest() --- Lib/test/test_turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index ae511b6cd84798..a9174ccf805359 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -470,7 +470,7 @@ def setUp(self): try: self.screen = turtle.Screen() except turtle.TK.TclError: - self.skipTest() # cannot instantiate RawTurtle without a screen + raise SkipTest() # cannot instantiate RawTurtle without a screen def test_clone(self): rawturtle = turtle.RawTurtle(self.screen) From c330f8266ee8d55c3b2cdd3a92c39e1b0d1d1824 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:50:12 +0900 Subject: [PATCH 17/20] Update test_turtle.py correct qualified name of unittest.case.SkipTest exception class --- Lib/test/test_turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index a9174ccf805359..b5c7b902d53562 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -470,7 +470,7 @@ def setUp(self): try: self.screen = turtle.Screen() except turtle.TK.TclError: - raise SkipTest() # cannot instantiate RawTurtle without a screen + raise unittest.SkipTest() # cannot instantiate RawTurtle without a screen def test_clone(self): rawturtle = turtle.RawTurtle(self.screen) From bad3fa27060a2bbd6d2c44fe816ca05286422ec4 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Wed, 20 Nov 2024 22:45:44 +0900 Subject: [PATCH 18/20] Update test_turtle.py lint: remove trailing whitespaces --- Lib/test/test_turtle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index b5c7b902d53562..436cae5083a83c 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -470,9 +470,9 @@ def setUp(self): try: self.screen = turtle.Screen() except turtle.TK.TclError: - raise unittest.SkipTest() # cannot instantiate RawTurtle without a screen + raise unittest.SkipTest() # cannot instantiate RawTurtle without a screen - def test_clone(self): + def test_clone(self): rawturtle = turtle.RawTurtle(self.screen) another_turtle = rawturtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) From 2b62c59a9604c5493617c86357e6df27bf5cfdbb Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Sat, 23 Nov 2024 21:00:33 +0900 Subject: [PATCH 19/20] Update Lib/test/test_turtle.py Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Lib/test/test_turtle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 436cae5083a83c..4adb39b637f4e7 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -473,10 +473,10 @@ def setUp(self): raise unittest.SkipTest() # cannot instantiate RawTurtle without a screen def test_clone(self): - rawturtle = turtle.RawTurtle(self.screen) - another_turtle = rawturtle.clone() + raw_turtle = turtle.RawTurtle(self.screen) + another_turtle = raw_turtle.clone() self.assertEqual(another_turtle.currentLineItem, another_turtle.items[-1]) - self.assertFalse(rawturtle.currentLineItem in another_turtle.items) + self.assertNotIn(raw_turtle.currentLineItem, another_turtle.items) class TestTurtleScreen(unittest.TestCase): From a78ce2ceeaefabb95c4ee27757a5997169203fc7 Mon Sep 17 00:00:00 2001 From: Chaebin-Kim24 <161917587+Chaebin-Kim24@users.noreply.github.com> Date: Sat, 23 Nov 2024 21:00:53 +0900 Subject: [PATCH 20/20] Update Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .../next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst b/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst index 53b9a85adea73d..c8744076d8b56b 100644 --- a/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst +++ b/Misc/NEWS.d/next/Library/2024-11-04-15-08-02.gh-issue-126399.-4rB22.rst @@ -1 +1 @@ -Fix :mod:`turtle` clone() items management when clearing cloned turtle items +Fix :meth:`turtle.clone` items management when clearing cloned turtle items.