summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/SocketServer.py6
-rwxr-xr-xLib/UserString.py2
-rw-r--r--Lib/idlelib/EditorWindow.py55
-rw-r--r--Lib/idlelib/NEWS.txt6
-rw-r--r--Lib/idlelib/ScriptBinding.py13
-rw-r--r--Lib/idlelib/configDialog.py3
-rw-r--r--Lib/test/test_complex.py14
-rw-r--r--Lib/test/test_descr.py17
-rw-r--r--Lib/test/test_gc.py22
-rw-r--r--Lib/test/test_mmap.py7
10 files changed, 99 insertions, 46 deletions
diff --git a/Lib/SocketServer.py b/Lib/SocketServer.py
index f62b7df..9c5d4c2 100644
--- a/Lib/SocketServer.py
+++ b/Lib/SocketServer.py
@@ -452,7 +452,11 @@ class ForkingMixIn:
except os.error:
pid = None
if not pid: break
- self.active_children.remove(pid)
+ try:
+ self.active_children.remove(pid)
+ except ValueError as e:
+ raise ValueError('%s. x=%d and list=%r' % (e.message, pid,
+ self.active_children))
def handle_timeout(self):
"""Wait for zombies after self.timeout seconds of inactivity.
diff --git a/Lib/UserString.py b/Lib/UserString.py
index 27b2b53..704ea59 100755
--- a/Lib/UserString.py
+++ b/Lib/UserString.py
@@ -162,8 +162,6 @@ class UserString(collections.Sequence):
def upper(self): return self.__class__(self.data.upper())
def zfill(self, width): return self.__class__(self.data.zfill(width))
-collections.Sequence.register(UserString)
-
class MutableString(UserString, collections.MutableSequence):
"""mutable string objects
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index 0cd668a..e1d9ba3 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -109,16 +109,6 @@ class EditorWindow(object):
self.width = idleConf.GetOption('main','EditorWindow','width')
self.text = text = MultiCallCreator(Text)(
text_frame, name='text', padx=5, wrap='none',
- foreground=idleConf.GetHighlight(currentTheme,
- 'normal',fgBg='fg'),
- background=idleConf.GetHighlight(currentTheme,
- 'normal',fgBg='bg'),
- highlightcolor=idleConf.GetHighlight(currentTheme,
- 'hilite',fgBg='fg'),
- highlightbackground=idleConf.GetHighlight(currentTheme,
- 'hilite',fgBg='bg'),
- insertbackground=idleConf.GetHighlight(currentTheme,
- 'cursor',fgBg='fg'),
width=self.width,
height=idleConf.GetOption('main','EditorWindow','height') )
self.top.focused_widget = self.text
@@ -225,7 +215,6 @@ class EditorWindow(object):
# Making the initial values larger slows things down more often.
self.num_context_lines = 50, 500, 5000000
self.per = per = self.Percolator(text)
- self.color = None
self.undo = undo = self.UndoDelegator()
per.insertfilter(undo)
text.undo_block_start = undo.undo_block_start
@@ -236,6 +225,7 @@ class EditorWindow(object):
io.set_filename_change_hook(self.filename_change_hook)
self.good_load = False
self.set_indentation_params(False)
+ self.color = None # initialized below in self.ResetColorizer
if filename:
if os.path.exists(filename) and not os.path.isdir(filename):
if io.loadfile(filename):
@@ -247,6 +237,7 @@ class EditorWindow(object):
per.insertfilter(color)
else:
io.set_filename(filename)
+ self.ResetColorizer()
self.saved_change_hook()
self.update_recent_files_list()
self.load_extensions()
@@ -561,36 +552,42 @@ class EditorWindow(object):
self.flist.filename_changed_edit(self)
self.saved_change_hook()
self.top.update_windowlist_registry(self)
- if self.ispythonsource(self.io.filename):
- self.addcolorizer()
- else:
- self.rmcolorizer()
+ self.ResetColorizer()
- def addcolorizer(self):
+ def _addcolorizer(self):
if self.color:
return
- self.per.removefilter(self.undo)
- self.color = self.ColorDelegator()
- self.per.insertfilter(self.color)
- self.per.insertfilter(self.undo)
+ if self.ispythonsource(self.io.filename):
+ self.color = self.ColorDelegator()
+ # can add more colorizers here...
+ if self.color:
+ self.per.removefilter(self.undo)
+ self.per.insertfilter(self.color)
+ self.per.insertfilter(self.undo)
- def rmcolorizer(self):
+ def _rmcolorizer(self):
if not self.color:
return
self.color.removecolors()
- self.per.removefilter(self.undo)
self.per.removefilter(self.color)
self.color = None
- self.per.insertfilter(self.undo)
def ResetColorizer(self):
- "Update the colour theme if it is changed"
- # Called from configDialog.py
- if self.color:
- self.color = self.ColorDelegator()
- self.per.insertfilter(self.color)
+ "Update the colour theme"
+ # Called from self.filename_change_hook and from configDialog.py
+ self._rmcolorizer()
+ self._addcolorizer()
theme = idleConf.GetOption('main','Theme','name')
- self.text.config(idleConf.GetHighlight(theme, "normal"))
+ normal_colors = idleConf.GetHighlight(theme, 'normal')
+ cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg')
+ select_colors = idleConf.GetHighlight(theme, 'hilite')
+ self.text.config(
+ foreground=normal_colors['foreground'],
+ background=normal_colors['background'],
+ insertbackground=cursor_color,
+ selectforeground=select_colors['foreground'],
+ selectbackground=select_colors['background'],
+ )
IDENTCHARS = string.ascii_letters + string.digits + "_"
diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index cd8565c..1885421 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -45,6 +45,12 @@ What's New in IDLE 2.6a1?
*Release date: XX-XXX-200X* UNRELEASED, but merged into 3.0
+- Configured selection highlighting colors were ignored; updating highlighting
+ in the config dialog would cause non-Python files to be colored as if they
+ were Python source; improve use of ColorDelagator. Patch 1334. Tal Einat.
+
+- ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
+
- There was an error on exit if no sys.exitfunc was defined. Issue 1647.
- Could not open files in .idlerc directory if latter was hidden on Windows.
diff --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py
index ae530e5..226c66c 100644
--- a/Lib/idlelib/ScriptBinding.py
+++ b/Lib/idlelib/ScriptBinding.py
@@ -55,11 +55,11 @@ class ScriptBinding:
def check_module_event(self, event):
filename = self.getfilename()
if not filename:
- return
+ return 'break'
if not self.checksyntax(filename):
- return
+ return 'break'
if not self.tabnanny(filename):
- return
+ return 'break'
def tabnanny(self, filename):
f = open(filename, 'r')
@@ -120,12 +120,12 @@ class ScriptBinding:
"""
filename = self.getfilename()
if not filename:
- return
+ return 'break'
code = self.checksyntax(filename)
if not code:
- return
+ return 'break'
if not self.tabnanny(filename):
- return
+ return 'break'
shell = self.shell
interp = shell.interp
if PyShell.use_subprocess:
@@ -148,6 +148,7 @@ class ScriptBinding:
# go to __stderr__. With subprocess, they go to the shell.
# Need to change streams in PyShell.ModifiedInterpreter.
interp.runcode(code)
+ return 'break'
def getfilename(self):
"""Get source filename. If not saved, offer to save (or create) file
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index d0e4066..b750dcd 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -1114,15 +1114,12 @@ class ConfigDialog(Toplevel):
def ActivateConfigChanges(self):
"Dynamically apply configuration changes"
winInstances = self.parent.instance_dict.keys()
- theme = idleConf.CurrentTheme()
- cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg')
for instance in winInstances:
instance.ResetColorizer()
instance.ResetFont()
instance.set_notabs_indentwidth()
instance.ApplyKeybindings()
instance.reset_help_menu_entries()
- instance.text.configure(insertbackground=cursor_color)
def Cancel(self):
self.destroy()
diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py
index 42dc3cf..fbed4f2 100644
--- a/Lib/test/test_complex.py
+++ b/Lib/test/test_complex.py
@@ -4,6 +4,8 @@ from test import test_support
from random import random
from math import atan2
+INF = float("inf")
+NAN = float("nan")
# These tests ensure that complex math does the right thing
class ComplexTest(unittest.TestCase):
@@ -316,6 +318,18 @@ class ComplexTest(unittest.TestCase):
self.assertEqual(-6j,complex(repr(-6j)))
self.assertEqual(6j,complex(repr(6j)))
+ self.assertEqual(repr(complex(1., INF)), "(1+inf*j)")
+ self.assertEqual(repr(complex(1., -INF)), "(1-inf*j)")
+ self.assertEqual(repr(complex(INF, 1)), "(inf+1j)")
+ self.assertEqual(repr(complex(-INF, INF)), "(-inf+inf*j)")
+ self.assertEqual(repr(complex(NAN, 1)), "(nan+1j)")
+ self.assertEqual(repr(complex(1, NAN)), "(1+nan*j)")
+ self.assertEqual(repr(complex(NAN, NAN)), "(nan+nan*j)")
+
+ self.assertEqual(repr(complex(0, INF)), "inf*j")
+ self.assertEqual(repr(complex(0, -INF)), "-inf*j")
+ self.assertEqual(repr(complex(0, NAN)), "nan*j")
+
def test_neg(self):
self.assertEqual(-(1+6j), -1-6j)
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index d28a84a..288afd4 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1067,6 +1067,23 @@ order (MRO) for bases """
a.foo = 42
self.assertEqual(a.__dict__, {"foo": 42})
+ def test_slots_descriptor(self):
+ # Issue2115: slot descriptors did not correctly check
+ # the type of the given object
+ import abc
+ class MyABC(metaclass=abc.ABCMeta):
+ __slots__ = "a"
+
+ class Unrelated(object):
+ pass
+ MyABC.register(Unrelated)
+
+ u = Unrelated()
+ self.assert_(isinstance(u, MyABC))
+
+ # This used to crash
+ self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
+
def test_dynamics(self):
# Testing class attribute propagation...
class D(object):
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index bae0038..9d5e0ea 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -236,21 +236,33 @@ class GCTests(unittest.TestCase):
gc.disable()
gc.set_threshold(*thresholds)
+ # The following two tests are fragile:
+ # They precisely count the number of allocations,
+ # which is highly implementation-dependent.
+ # For example:
+ # - disposed tuples are not freed, but reused
+ # - the call to assertEqual somehow avoids building its args tuple
def test_get_count(self):
+ # Avoid future allocation of method object
+ assertEqual = self.assertEqual
gc.collect()
- self.assertEqual(gc.get_count(), (0, 0, 0))
+ assertEqual(gc.get_count(), (0, 0, 0))
a = dict()
- self.assertEqual(gc.get_count(), (1, 0, 0))
+ # since gc.collect(), we created two objects:
+ # the dict, and the tuple returned by get_count()
+ assertEqual(gc.get_count(), (2, 0, 0))
def test_collect_generations(self):
+ # Avoid future allocation of method object
+ assertEqual = self.assertEqual
gc.collect()
a = dict()
gc.collect(0)
- self.assertEqual(gc.get_count(), (0, 1, 0))
+ assertEqual(gc.get_count(), (0, 1, 0))
gc.collect(1)
- self.assertEqual(gc.get_count(), (0, 0, 1))
+ assertEqual(gc.get_count(), (0, 0, 1))
gc.collect(2)
- self.assertEqual(gc.get_count(), (0, 0, 0))
+ assertEqual(gc.get_count(), (0, 0, 0))
def test_trashcan(self):
class Ouch:
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index f6ee371..c3f7dbb 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -425,6 +425,13 @@ class MmapTests(unittest.TestCase):
return mmap.mmap.__new__(klass, -1, *args, **kwargs)
anon_mmap(PAGESIZE)
+ def test_prot_readonly(self):
+ mapsize = 10
+ open(TESTFN, "wb").write(b"a"*mapsize)
+ f = open(TESTFN, "rb")
+ m = mmap.mmap(f.fileno(), mapsize, prot=mmap.PROT_READ)
+ self.assertRaises(TypeError, m.write, "foo")
+
def test_main():
run_unittest(MmapTests)