Mercurial > cpython-lru_cache-weakref
annotate Lib/idlelib/ScriptBinding.py @ 58765:2ba7677bfa95 legacy-trunk
testCopysign was defined twice in test_math; combine the definitions
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Sat, 06 Feb 2010 23:11:25 +0000 |
| parents | b53604fad54b |
| children | eab361617f6a |
| rev | line source |
|---|---|
| 13975 | 1 """Extension to execute code outside the Python shell window. |
| 2 | |
|
23784
24b0f6d693e3
Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents:
23547
diff
changeset
|
3 This adds the following commands: |
| 13975 | 4 |
|
23784
24b0f6d693e3
Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents:
23547
diff
changeset
|
5 - Check module does a full syntax check of the current module. |
| 26693 | 6 It also runs the tabnanny to catch any inconsistent tabs. |
| 13975 | 7 |
| 25123 | 8 - Run module executes the module's code in the __main__ namespace. The window |
| 26693 | 9 must have been saved previously. The module is added to sys.modules, and is |
| 10 also added to the __main__ namespace. | |
| 13975 | 11 |
| 26693 | 12 XXX GvR Redesign this interface (yet again) as follows: |
| 23547 | 13 |
| 27390 | 14 - Present a dialog box for ``Run Module'' |
| 23547 | 15 |
| 16 - Allow specify command line arguments in the dialog box | |
| 17 | |
| 13975 | 18 """ |
| 19 | |
| 29346 | 20 import os |
| 26693 | 21 import re |
| 22 import string | |
| 23 import tabnanny | |
| 24 import tokenize | |
|
47183
b53604fad54b
Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents:
47101
diff
changeset
|
25 import tkMessageBox |
|
29119
7875fcaae7a3
1. Restore the capability to run and debug without a subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
27920
diff
changeset
|
26 import PyShell |
| 13975 | 27 |
| 29266 | 28 from configHandler import idleConf |
| 29 | |
| 26693 | 30 IDENTCHARS = string.ascii_letters + string.digits + "_" |
| 31 | |
| 13975 | 32 indent_message = """Error: Inconsistent indentation detected! |
| 33 | |
|
35065
aa1c5366607d
1. Clarify "tab/space" Error Dialog and "Tab Width" Dialog associated with
Kurt B. Kaiser <kbk@shore.net>
parents:
34443
diff
changeset
|
34 1) Your indentation is outright incorrect (easy to fix), OR |
| 13975 | 35 |
|
35065
aa1c5366607d
1. Clarify "tab/space" Error Dialog and "Tab Width" Dialog associated with
Kurt B. Kaiser <kbk@shore.net>
parents:
34443
diff
changeset
|
36 2) Your indentation mixes tabs and spaces. |
| 13975 | 37 |
|
35065
aa1c5366607d
1. Clarify "tab/space" Error Dialog and "Tab Width" Dialog associated with
Kurt B. Kaiser <kbk@shore.net>
parents:
34443
diff
changeset
|
38 To fix case 2, change all tabs to spaces by using Edit->Select All followed \ |
|
aa1c5366607d
1. Clarify "tab/space" Error Dialog and "Tab Width" Dialog associated with
Kurt B. Kaiser <kbk@shore.net>
parents:
34443
diff
changeset
|
39 by Format->Untabify Region and specify the number of columns used by each tab. |
|
aa1c5366607d
1. Clarify "tab/space" Error Dialog and "Tab Width" Dialog associated with
Kurt B. Kaiser <kbk@shore.net>
parents:
34443
diff
changeset
|
40 """ |
|
23784
24b0f6d693e3
Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents:
23547
diff
changeset
|
41 |
| 13975 | 42 class ScriptBinding: |
|
18497
42741e677338
py-cvs merge, better error dialog
Steven M. Gava <elguavas@python.net>
parents:
13975
diff
changeset
|
43 |
| 13975 | 44 menudefs = [ |
|
23784
24b0f6d693e3
Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents:
23547
diff
changeset
|
45 ('run', [None, |
| 26693 | 46 ('Check Module', '<<check-module>>'), |
| 27390 | 47 ('Run Module', '<<run-module>>'), ]), ] |
| 13975 | 48 |
| 49 def __init__(self, editwin): | |
| 50 self.editwin = editwin | |
| 51 # Provide instance variables referenced by Debugger | |
| 52 # XXX This should be done differently | |
| 53 self.flist = self.editwin.flist | |
|
39165
0c00e2f509e0
- EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents:
35384
diff
changeset
|
54 self.root = self.editwin.root |
| 13975 | 55 |
|
35384
34ff7ca4cef8
Revert previous code elimination, 'filename' is needed.
Kurt B. Kaiser <kbk@shore.net>
parents:
35383
diff
changeset
|
56 def check_module_event(self, event): |
| 13975 | 57 filename = self.getfilename() |
| 58 if not filename: | |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
59 return 'break' |
|
39945
257daf39b08c
Some syntax errors were being caught by tokenize during the tabnanny
Kurt B. Kaiser <kbk@shore.net>
parents:
39424
diff
changeset
|
60 if not self.checksyntax(filename): |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
61 return 'break' |
| 13975 | 62 if not self.tabnanny(filename): |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
63 return 'break' |
| 13975 | 64 |
| 65 def tabnanny(self, filename): | |
| 66 f = open(filename, 'r') | |
| 67 try: | |
| 25312 | 68 tabnanny.process_tokens(tokenize.generate_tokens(f.readline)) |
| 13975 | 69 except tokenize.TokenError, msg: |
|
29363
c66100c09ea1
SF 747667 Error Doesn't Decolorize
Kurt B. Kaiser <kbk@shore.net>
parents:
29346
diff
changeset
|
70 msgtxt, (lineno, start) = msg |
|
c66100c09ea1
SF 747667 Error Doesn't Decolorize
Kurt B. Kaiser <kbk@shore.net>
parents:
29346
diff
changeset
|
71 self.editwin.gotoline(lineno) |
|
c66100c09ea1
SF 747667 Error Doesn't Decolorize
Kurt B. Kaiser <kbk@shore.net>
parents:
29346
diff
changeset
|
72 self.errorbox("Tabnanny Tokenizing Error", |
|
c66100c09ea1
SF 747667 Error Doesn't Decolorize
Kurt B. Kaiser <kbk@shore.net>
parents:
29346
diff
changeset
|
73 "Token Error: %s" % msgtxt) |
| 26475 | 74 return False |
| 13975 | 75 except tabnanny.NannyNag, nag: |
| 76 # The error messages from tabnanny are too confusing... | |
| 77 self.editwin.gotoline(nag.get_lineno()) | |
| 78 self.errorbox("Tab/space error", indent_message) | |
| 26475 | 79 return False |
| 80 return True | |
| 13975 | 81 |
| 82 def checksyntax(self, filename): | |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
83 self.shell = shell = self.flist.open_shell() |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
84 saved_stream = shell.get_warning_stream() |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
85 shell.set_warning_stream(shell.stderr) |
| 13975 | 86 f = open(filename, 'r') |
| 87 source = f.read() | |
| 88 f.close() | |
| 89 if '\r' in source: | |
| 90 source = re.sub(r"\r\n", "\n", source) | |
|
35383
04dd5b06d3c8
1. Mac line endings were incorrect when pasting code from some browsers
Kurt B. Kaiser <kbk@shore.net>
parents:
35065
diff
changeset
|
91 source = re.sub(r"\r", "\n", source) |
| 13975 | 92 if source and source[-1] != '\n': |
| 93 source = source + '\n' | |
|
29363
c66100c09ea1
SF 747667 Error Doesn't Decolorize
Kurt B. Kaiser <kbk@shore.net>
parents:
29346
diff
changeset
|
94 text = self.editwin.text |
|
c66100c09ea1
SF 747667 Error Doesn't Decolorize
Kurt B. Kaiser <kbk@shore.net>
parents:
29346
diff
changeset
|
95 text.tag_remove("ERROR", "1.0", "end") |
| 13975 | 96 try: |
| 97 try: | |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
98 # If successful, return the compiled code |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
99 return compile(source, filename, "exec") |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
100 except (SyntaxError, OverflowError), err: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
101 try: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
102 msg, (errorfilename, lineno, offset, line) = err |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
103 if not errorfilename: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
104 err.args = msg, (filename, lineno, offset, line) |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
105 err.filename = filename |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
106 self.colorize_syntax_error(msg, lineno, offset) |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
107 except: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
108 msg = "*** " + str(err) |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
109 self.errorbox("Syntax error", |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
110 "There's an error in your program:\n" + msg) |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
111 return False |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
112 finally: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
113 shell.set_warning_stream(saved_stream) |
| 26959 | 114 |
| 26693 | 115 def colorize_syntax_error(self, msg, lineno, offset): |
| 116 text = self.editwin.text | |
| 117 pos = "0.0 + %d lines + %d chars" % (lineno-1, offset-1) | |
| 118 text.tag_add("ERROR", pos) | |
| 119 char = text.get(pos) | |
| 120 if char and char in IDENTCHARS: | |
| 121 text.tag_add("ERROR", pos + " wordstart", pos) | |
| 122 if '\n' == text.get(pos): # error at line end | |
| 123 text.mark_set("insert", pos) | |
| 124 else: | |
| 125 text.mark_set("insert", pos + "+1c") | |
| 126 text.see(pos) | |
| 26959 | 127 |
| 27390 | 128 def run_module_event(self, event): |
| 29346 | 129 """Run the module after setting up the environment. |
| 130 | |
| 131 First check the syntax. If OK, make sure the shell is active and | |
| 132 then transfer the arguments, set the run environment's working | |
| 133 directory to the directory of the module being executed and also | |
| 134 add that directory to its sys.path if not already included. | |
| 135 | |
| 136 """ | |
|
35384
34ff7ca4cef8
Revert previous code elimination, 'filename' is needed.
Kurt B. Kaiser <kbk@shore.net>
parents:
35383
diff
changeset
|
137 filename = self.getfilename() |
|
34ff7ca4cef8
Revert previous code elimination, 'filename' is needed.
Kurt B. Kaiser <kbk@shore.net>
parents:
35383
diff
changeset
|
138 if not filename: |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
139 return 'break' |
|
35384
34ff7ca4cef8
Revert previous code elimination, 'filename' is needed.
Kurt B. Kaiser <kbk@shore.net>
parents:
35383
diff
changeset
|
140 code = self.checksyntax(filename) |
| 26693 | 141 if not code: |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
142 return 'break' |
|
39945
257daf39b08c
Some syntax errors were being caught by tokenize during the tabnanny
Kurt B. Kaiser <kbk@shore.net>
parents:
39424
diff
changeset
|
143 if not self.tabnanny(filename): |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
144 return 'break' |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
145 shell = self.shell |
| 13975 | 146 interp = shell.interp |
|
29119
7875fcaae7a3
1. Restore the capability to run and debug without a subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
27920
diff
changeset
|
147 if PyShell.use_subprocess: |
|
7875fcaae7a3
1. Restore the capability to run and debug without a subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
27920
diff
changeset
|
148 shell.restart_shell() |
| 29346 | 149 dirname = os.path.dirname(filename) |
| 23547 | 150 # XXX Too often this discards arguments the user just set... |
| 151 interp.runcommand("""if 1: | |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
31412
diff
changeset
|
152 _filename = %r |
| 23547 | 153 import sys as _sys |
| 154 from os.path import basename as _basename | |
| 155 if (not _sys.argv or | |
| 156 _basename(_sys.argv[0]) != _basename(_filename)): | |
| 157 _sys.argv = [_filename] | |
| 29346 | 158 import os as _os |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
31412
diff
changeset
|
159 _os.chdir(%r) |
| 29346 | 160 del _filename, _sys, _basename, _os |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
31412
diff
changeset
|
161 \n""" % (filename, dirname)) |
|
29122
c7dfda993b2f
1. When a module is run from an EditorWindow, if its directory is not in
Kurt B. Kaiser <kbk@shore.net>
parents:
29119
diff
changeset
|
162 interp.prepend_syspath(filename) |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
163 # XXX KBK 03Jul04 When run w/o subprocess, runtime warnings still |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
164 # go to __stderr__. With subprocess, they go to the shell. |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31515
diff
changeset
|
165 # Need to change streams in PyShell.ModifiedInterpreter. |
| 26693 | 166 interp.runcode(code) |
|
45366
d8f12bae378a
ScriptBinding event handlers weren't returning 'break'. Patch 2050, Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents:
39945
diff
changeset
|
167 return 'break' |
| 13975 | 168 |
| 169 def getfilename(self): | |
|
26713
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
170 """Get source filename. If not saved, offer to save (or create) file |
|
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
171 |
|
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
172 The debugger requires a source file. Make sure there is one, and that |
|
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
173 the current version of the source buffer has been saved. If the user |
|
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
174 declines to save or cancels the Save As dialog, return None. |
| 29266 | 175 |
| 176 If the user has configured IDLE for Autosave, the file will be | |
| 177 silently saved if it already exists and is dirty. | |
| 29271 | 178 |
|
26713
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
179 """ |
| 29266 | 180 filename = self.editwin.io.filename |
| 13975 | 181 if not self.editwin.get_saved(): |
| 29266 | 182 autosave = idleConf.GetOption('main', 'General', |
| 183 'autosave', type='bool') | |
| 184 if autosave and filename: | |
|
26713
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
185 self.editwin.io.save(None) |
|
eab6d7c80341
If Edit window has not been saved, offer to save if user tries to Run or
Kurt B. Kaiser <kbk@shore.net>
parents:
26693
diff
changeset
|
186 else: |
| 29266 | 187 reply = self.ask_save_dialog() |
| 188 self.editwin.text.focus_set() | |
| 189 if reply == "ok": | |
| 190 self.editwin.io.save(None) | |
| 191 filename = self.editwin.io.filename | |
| 192 else: | |
| 193 filename = None | |
| 13975 | 194 return filename |
| 195 | |
| 29266 | 196 def ask_save_dialog(self): |
| 197 msg = "Source Must Be Saved\n" + 5*' ' + "OK to Save?" | |
| 198 mb = tkMessageBox.Message(title="Save Before Run or Check", | |
| 199 message=msg, | |
| 200 icon=tkMessageBox.QUESTION, | |
| 201 type=tkMessageBox.OKCANCEL, | |
| 202 default=tkMessageBox.OK, | |
| 203 master=self.editwin.text) | |
| 204 return mb.show() | |
| 205 | |
| 13975 | 206 def errorbox(self, title, message): |
| 207 # XXX This should really be a function of EditorWindow... | |
| 208 tkMessageBox.showerror(title, message, master=self.editwin.text) | |
| 209 self.editwin.text.focus_set() |
