mirror of https://github.com/python/cpython
merge heads
This commit is contained in:
commit
bc8197a287
|
@ -511,8 +511,8 @@ class SequenceMatcher:
|
|||
non_adjacent.append((i1, j1, k1))
|
||||
|
||||
non_adjacent.append( (la, lb, 0) )
|
||||
self.matching_blocks = non_adjacent
|
||||
return map(Match._make, self.matching_blocks)
|
||||
self.matching_blocks = list(map(Match._make, non_adjacent))
|
||||
return self.matching_blocks
|
||||
|
||||
def get_opcodes(self):
|
||||
"""Return list of 5-tuples describing how to turn a into b.
|
||||
|
|
|
@ -76,6 +76,15 @@ class TestSFbugs(unittest.TestCase):
|
|||
diff_gen = difflib.unified_diff([], [])
|
||||
self.assertRaises(StopIteration, next, diff_gen)
|
||||
|
||||
def test_matching_blocks_cache(self):
|
||||
# Issue #21635
|
||||
s = difflib.SequenceMatcher(None, "abxcd", "abcd")
|
||||
first = s.get_matching_blocks()
|
||||
second = s.get_matching_blocks()
|
||||
self.assertEqual(second[0].size, 2)
|
||||
self.assertEqual(second[1].size, 2)
|
||||
self.assertEqual(second[2].size, 0)
|
||||
|
||||
def test_added_tab_hint(self):
|
||||
# Check fix for bug #1488943
|
||||
diff = list(difflib.Differ().compare(["\tI am a buggy"],["\t\tI am a bug"]))
|
||||
|
|
|
@ -2,7 +2,6 @@ import os
|
|||
import sys
|
||||
import builtins
|
||||
import contextlib
|
||||
import difflib
|
||||
import inspect
|
||||
import pydoc
|
||||
import keyword
|
||||
|
@ -356,15 +355,6 @@ def get_pydoc_text(module):
|
|||
output = patt.sub('', output)
|
||||
return output.strip(), loc
|
||||
|
||||
def print_diffs(text1, text2):
|
||||
"Prints unified diffs for two texts"
|
||||
# XXX now obsolete, use unittest built-in support
|
||||
lines1 = text1.splitlines(keepends=True)
|
||||
lines2 = text2.splitlines(keepends=True)
|
||||
diffs = difflib.unified_diff(lines1, lines2, n=0, fromfile='expected',
|
||||
tofile='got')
|
||||
print('\n' + ''.join(diffs))
|
||||
|
||||
def get_html_title(text):
|
||||
# Bit of hack, but good enough for test purposes
|
||||
header, _, _ = text.partition("</head>")
|
||||
|
@ -414,9 +404,7 @@ class PydocDocTest(unittest.TestCase):
|
|||
expected_html = expected_html_pattern % (
|
||||
(mod_url, mod_file, doc_loc) +
|
||||
expected_html_data_docstrings)
|
||||
if result != expected_html:
|
||||
print_diffs(expected_html, result)
|
||||
self.fail("outputs are not equal, see diff above")
|
||||
self.assertEqual(result, expected_html)
|
||||
|
||||
@unittest.skipIf(sys.flags.optimize >= 2,
|
||||
"Docstrings are omitted with -O2 and above")
|
||||
|
@ -429,9 +417,7 @@ class PydocDocTest(unittest.TestCase):
|
|||
(doc_loc,) +
|
||||
expected_text_data_docstrings +
|
||||
(inspect.getabsfile(pydoc_mod),))
|
||||
if result != expected_text:
|
||||
print_diffs(expected_text, result)
|
||||
self.fail("outputs are not equal, see diff above")
|
||||
self.assertEqual(expected_text, result)
|
||||
|
||||
def test_text_enum_member_with_value_zero(self):
|
||||
# Test issue #20654 to ensure enum member with value 0 can be
|
||||
|
@ -887,9 +873,7 @@ class PydocWithMetaClasses(unittest.TestCase):
|
|||
expected_text = expected_dynamicattribute_pattern % (
|
||||
(__name__,) + expected_text_data_docstrings[:2])
|
||||
result = output.getvalue().strip()
|
||||
if result != expected_text:
|
||||
print_diffs(expected_text, result)
|
||||
self.fail("outputs are not equal, see diff above")
|
||||
self.assertEqual(expected_text, result)
|
||||
|
||||
@unittest.skipIf(sys.flags.optimize >= 2,
|
||||
"Docstrings are omitted with -O2 and above")
|
||||
|
@ -910,9 +894,7 @@ class PydocWithMetaClasses(unittest.TestCase):
|
|||
helper(Class)
|
||||
expected_text = expected_virtualattribute_pattern1 % __name__
|
||||
result = output.getvalue().strip()
|
||||
if result != expected_text:
|
||||
print_diffs(expected_text, result)
|
||||
self.fail("outputs are not equal, see diff above")
|
||||
self.assertEqual(expected_text, result)
|
||||
|
||||
@unittest.skipIf(sys.flags.optimize >= 2,
|
||||
"Docstrings are omitted with -O2 and above")
|
||||
|
@ -952,19 +934,13 @@ class PydocWithMetaClasses(unittest.TestCase):
|
|||
helper(Class1)
|
||||
expected_text1 = expected_virtualattribute_pattern2 % __name__
|
||||
result1 = output.getvalue().strip()
|
||||
if result1 != expected_text1:
|
||||
print_diffs(expected_text1, result1)
|
||||
fail1 = True
|
||||
self.assertEqual(expected_text1, result1)
|
||||
output = StringIO()
|
||||
helper = pydoc.Helper(output=output)
|
||||
helper(Class2)
|
||||
expected_text2 = expected_virtualattribute_pattern3 % __name__
|
||||
result2 = output.getvalue().strip()
|
||||
if result2 != expected_text2:
|
||||
print_diffs(expected_text2, result2)
|
||||
fail2 = True
|
||||
if fail1 or fail2:
|
||||
self.fail("outputs are not equal, see diff above")
|
||||
self.assertEqual(expected_text2, result2)
|
||||
|
||||
@unittest.skipIf(sys.flags.optimize >= 2,
|
||||
"Docstrings are omitted with -O2 and above")
|
||||
|
@ -981,9 +957,7 @@ class PydocWithMetaClasses(unittest.TestCase):
|
|||
helper(C)
|
||||
expected_text = expected_missingattribute_pattern % __name__
|
||||
result = output.getvalue().strip()
|
||||
if result != expected_text:
|
||||
print_diffs(expected_text, result)
|
||||
self.fail("outputs are not equal, see diff above")
|
||||
self.assertEqual(expected_text, result)
|
||||
|
||||
|
||||
@reap_threads
|
||||
|
|
|
@ -2945,7 +2945,7 @@ class RawTurtle(TPen, TNavigator):
|
|||
self._stretchfactor = a11, a22
|
||||
self._shearfactor = a12/a22
|
||||
self._tilt = alfa
|
||||
self._update()
|
||||
self.pen(resizemode="user")
|
||||
|
||||
|
||||
def _polytrafo(self, poly):
|
||||
|
|
|
@ -11,6 +11,7 @@ and time
|
|||
------------------------------------
|
||||
"""
|
||||
from turtle import *
|
||||
from turtle import Terminator # not in __all__
|
||||
from datetime import datetime
|
||||
|
||||
mode("logo")
|
||||
|
@ -102,22 +103,25 @@ def tick():
|
|||
sekunde = t.second + t.microsecond*0.000001
|
||||
minute = t.minute + sekunde/60.0
|
||||
stunde = t.hour + minute/60.0
|
||||
tracer(False)
|
||||
writer.clear()
|
||||
writer.home()
|
||||
writer.forward(65)
|
||||
writer.write(wochentag(t),
|
||||
align="center", font=("Courier", 14, "bold"))
|
||||
writer.back(150)
|
||||
writer.write(datum(t),
|
||||
align="center", font=("Courier", 14, "bold"))
|
||||
writer.forward(85)
|
||||
tracer(True)
|
||||
second_hand.setheading(6*sekunde)
|
||||
minute_hand.setheading(6*minute)
|
||||
hour_hand.setheading(30*stunde)
|
||||
tracer(True)
|
||||
ontimer(tick, 100)
|
||||
try:
|
||||
tracer(False) # Terminator can occur here
|
||||
writer.clear()
|
||||
writer.home()
|
||||
writer.forward(65)
|
||||
writer.write(wochentag(t),
|
||||
align="center", font=("Courier", 14, "bold"))
|
||||
writer.back(150)
|
||||
writer.write(datum(t),
|
||||
align="center", font=("Courier", 14, "bold"))
|
||||
writer.forward(85)
|
||||
tracer(True)
|
||||
second_hand.setheading(6*sekunde) # or here
|
||||
minute_hand.setheading(6*minute)
|
||||
hour_hand.setheading(30*stunde)
|
||||
tracer(True)
|
||||
ontimer(tick, 100)
|
||||
except Terminator:
|
||||
pass # turtledemo user pressed STOP
|
||||
|
||||
def main():
|
||||
tracer(False)
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
turtleDemo - Help
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
This document has two sections:
|
||||
|
||||
(1) How to use the demo viewer
|
||||
(2) How to add your own demos to the demo repository
|
||||
|
||||
|
||||
(1) How to use the demo viewer.
|
||||
|
||||
Select a demoscript from the example menu.
|
||||
The (syntax coloured) source code appears in the left
|
||||
source code window. IT CANNOT BE EDITED, but ONLY VIEWED!
|
||||
|
||||
- Press START button to start the demo.
|
||||
- Stop execution by pressing the STOP button.
|
||||
- Clear screen by pressing the CLEAR button.
|
||||
- Restart by pressing the START button again.
|
||||
|
||||
SPECIAL demos are those which run EVENTDRIVEN.
|
||||
(For example clock.py - or oldTurtleDemo.py which
|
||||
in the end expects a mouse click.):
|
||||
|
||||
Press START button to start the demo.
|
||||
|
||||
- Until the EVENTLOOP is entered everything works
|
||||
as in an ordinary demo script.
|
||||
|
||||
- When the EVENTLOOP is entered, you control the
|
||||
application by using the mouse and/or keys (or it's
|
||||
controlled by some timer events)
|
||||
To stop it you can and must press the STOP button.
|
||||
|
||||
While the EVENTLOOP is running, the examples menu is disabled.
|
||||
|
||||
- Only after having pressed the STOP button, you may
|
||||
restart it or choose another example script.
|
||||
|
||||
* * * * * * * *
|
||||
In some rare situations there may occur interferences/conflicts
|
||||
between events concerning the demo script and those concerning the
|
||||
demo-viewer. (They run in the same process.) Strange behaviour may be
|
||||
the consequence and in the worst case you must close and restart the
|
||||
viewer.
|
||||
* * * * * * * *
|
||||
|
||||
|
||||
(2) How to add your own demos to the demo repository
|
||||
|
||||
- place: same directory as turtledemo/__main__.py
|
||||
|
||||
- requirements on source code:
|
||||
code must contain a main() function which will
|
||||
be executed by the viewer (see provided example scripts)
|
||||
main() may return a string which will be displayed
|
||||
in the Label below the source code window (when execution
|
||||
has finished.)
|
||||
|
||||
If the demo is EVENT DRIVEN, main must return the string
|
||||
"EVENTLOOP". This informs the demo viewer that the script is
|
||||
still running and must be stopped by the user!
|
||||
|
||||
If an "EVENTLOOP" demo runs by itself, as with clock, which uses
|
||||
ontimer, or minimal_hanoi, which loops by recursion, then the
|
||||
code should catch the turtle.Terminator exception that will be
|
||||
raised when the user presses the STOP button. (Paint is not such
|
||||
a demo; it only acts in response to mouse clicks and movements.)
|
||||
|
|
@ -18,6 +18,7 @@ stretched to rectangles by shapesize()
|
|||
---------------------------------------
|
||||
"""
|
||||
from turtle import *
|
||||
from turtle import Terminator # not in __all__
|
||||
|
||||
class Disc(Turtle):
|
||||
def __init__(self, n):
|
||||
|
@ -50,9 +51,12 @@ def hanoi(n, from_, with_, to_):
|
|||
def play():
|
||||
onkey(None,"space")
|
||||
clear()
|
||||
hanoi(6, t1, t2, t3)
|
||||
write("press STOP button to exit",
|
||||
align="center", font=("Courier", 16, "bold"))
|
||||
try:
|
||||
hanoi(6, t1, t2, t3)
|
||||
write("press STOP button to exit",
|
||||
align="center", font=("Courier", 16, "bold"))
|
||||
except Terminator:
|
||||
pass # turtledemo user pressed STOP
|
||||
|
||||
def main():
|
||||
global t1, t2, t3
|
||||
|
|
Loading…
Reference in New Issue