| 
									
										
										
										
											2017-09-23 16:46:01 -04:00
										 |  |  | """Module browser.
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | XXX TO DO: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - reparse when source changed (maybe just a button would be OK?) | 
					
						
							|  |  |  |     (or recheck on window popup) | 
					
						
							|  |  |  | - add popup menu with more options (e.g. doc strings, base classes, imports) | 
					
						
							|  |  |  | - add base classes to class browser tree | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  | - finish removing limitation to x.py files (ModuleBrowserTreeItem) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import pyclbr | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | from idlelib.config import idleConf | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  | from idlelib import pyshell | 
					
						
							|  |  |  | from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas | 
					
						
							| 
									
										
										
										
											2018-06-20 21:25:59 -04:00
										 |  |  | from idlelib.window import ListedToplevel | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-17 01:31:35 -04:00
										 |  |  | file_open = None  # Method...Item and Class...Item use this. | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  | # Normally pyshell.flist.open, but there is no pyshell.flist for htest. | 
					
						
							| 
									
										
										
										
											2014-10-17 01:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | def transform_children(child_dict, modname=None): | 
					
						
							|  |  |  |     """Transform a child dictionary to an ordered sequence of objects.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The dictionary maps names to pyclbr information objects. | 
					
						
							|  |  |  |     Filter out imported objects. | 
					
						
							|  |  |  |     Augment class names with bases. | 
					
						
							| 
									
										
										
										
											2019-08-30 16:16:37 -04:00
										 |  |  |     The insertion order of the dictionary is assumed to have been in line | 
					
						
							| 
									
										
										
										
											2019-06-01 17:03:22 -04:00
										 |  |  |     number order, so sorting is not necessary. | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-01 17:03:22 -04:00
										 |  |  |     The current tree only calls this once per child_dict as it saves | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |     TreeItems once created.  A future tree and tests might violate this, | 
					
						
							|  |  |  |     so a check prevents multiple in-place augmentations. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     obs = []  # Use list since values should already be sorted. | 
					
						
							|  |  |  |     for key, obj in child_dict.items(): | 
					
						
							|  |  |  |         if modname is None or obj.module == modname: | 
					
						
							|  |  |  |             if hasattr(obj, 'super') and obj.super and obj.name == key: | 
					
						
							|  |  |  |                 # If obj.name != key, it has already been suffixed. | 
					
						
							|  |  |  |                 supers = [] | 
					
						
							|  |  |  |                 for sup in obj.super: | 
					
						
							|  |  |  |                     if type(sup) is type(''): | 
					
						
							|  |  |  |                         sname = sup | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         sname = sup.name | 
					
						
							|  |  |  |                         if sup.module != obj.module: | 
					
						
							|  |  |  |                             sname = f'{sup.module}.{sname}' | 
					
						
							|  |  |  |                     supers.append(sname) | 
					
						
							|  |  |  |                 obj.name += '({})'.format(', '.join(supers)) | 
					
						
							|  |  |  |             obs.append(obj) | 
					
						
							| 
									
										
										
										
											2019-06-01 17:03:22 -04:00
										 |  |  |     return obs | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-23 16:46:01 -04:00
										 |  |  | class ModuleBrowser: | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |     """Browse module classes and functions in IDLE.
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     # This class is also the base class for pathbrowser.PathBrowser. | 
					
						
							| 
									
										
										
										
											2017-11-05 07:37:50 -06:00
										 |  |  |     # Init and close are inherited, other methods are overridden. | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     # PathBrowser.__init__ does not call __init__ below. | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     def __init__(self, master, path, *, _htest=False, _utest=False): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         """Create a window for browsing a module's structure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |             master: parent for widgets. | 
					
						
							|  |  |  |             path: full path of file to browse. | 
					
						
							|  |  |  |             _htest - bool; change box location when running htest. | 
					
						
							|  |  |  |             -utest - bool; suppress contents when running unittest. | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Global variables: | 
					
						
							|  |  |  |             file_open: Function used for opening a file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Instance variables: | 
					
						
							|  |  |  |             name: Module name. | 
					
						
							|  |  |  |             file: Full path and module with .py extension.  Used in | 
					
						
							|  |  |  |                 creating ModuleBrowserTreeItem as the rootnode for | 
					
						
							|  |  |  |                 the tree and subsequently in the children. | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         self.master = master | 
					
						
							|  |  |  |         self.path = path | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |         self._htest = _htest | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         self._utest = _utest | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         self.init() | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def close(self, event=None): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Dismiss the window and the tree nodes." | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         self.top.destroy() | 
					
						
							|  |  |  |         self.node.destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     def init(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Create browser tkinter widgets, including the tree." | 
					
						
							| 
									
										
										
										
											2017-11-22 19:05:25 -05:00
										 |  |  |         global file_open | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         root = self.master | 
					
						
							| 
									
										
										
										
											2017-11-22 19:05:25 -05:00
										 |  |  |         flist = (pyshell.flist if not (self._htest or self._utest) | 
					
						
							|  |  |  |                  else pyshell.PyShellFileList(root)) | 
					
						
							|  |  |  |         file_open = flist.open | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         pyclbr._modules.clear() | 
					
						
							| 
									
										
										
										
											2017-11-22 19:05:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         # create top | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         self.top = top = ListedToplevel(root) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         top.protocol("WM_DELETE_WINDOW", self.close) | 
					
						
							|  |  |  |         top.bind("<Escape>", self.close) | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |         if self._htest: # place dialog below parent if running htest | 
					
						
							|  |  |  |             top.geometry("+%d+%d" % | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |                 (root.winfo_rootx(), root.winfo_rooty() + 200)) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         self.settitle() | 
					
						
							|  |  |  |         top.focus_set() | 
					
						
							| 
									
										
										
										
											2017-11-22 19:05:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         # create scrolled canvas | 
					
						
							| 
									
										
										
										
											2015-11-12 15:02:57 -05:00
										 |  |  |         theme = idleConf.CurrentTheme() | 
					
						
							| 
									
										
										
										
											2004-03-08 18:15:31 +00:00
										 |  |  |         background = idleConf.GetHighlight(theme, 'normal')['background'] | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         sc = ScrolledCanvas(top, bg=background, highlightthickness=0, | 
					
						
							|  |  |  |                             takefocus=1) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         sc.frame.pack(expand=1, fill="both") | 
					
						
							|  |  |  |         item = self.rootnode() | 
					
						
							|  |  |  |         self.node = node = TreeNode(sc.canvas, None, item) | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         if not self._utest: | 
					
						
							|  |  |  |             node.update() | 
					
						
							|  |  |  |             node.expand() | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def settitle(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Set the window title." | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         self.top.wm_title("Module Browser - " + os.path.basename(self.path)) | 
					
						
							| 
									
										
										
										
											2017-09-23 16:46:01 -04:00
										 |  |  |         self.top.wm_iconname("Module Browser") | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def rootnode(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Return a ModuleBrowserTreeItem as the root of the tree." | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         return ModuleBrowserTreeItem(self.path) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | class ModuleBrowserTreeItem(TreeItem): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |     """Browser tree for Python module.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Uses TreeItem as the basis for the structure of the tree. | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     Used by both browsers. | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, file): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         """Create a TreeItem for the file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             file: Full path and module name. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         self.file = file | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def GetText(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Return the module name as the text string to display." | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         return os.path.basename(self.file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def GetIconName(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Return the name of the icon to display." | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         return "python" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def GetSubList(self): | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         "Return ChildBrowserTreeItems for children." | 
					
						
							|  |  |  |         return [ChildBrowserTreeItem(obj) for obj in self.listchildren()] | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def OnDoubleClick(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Open a module in an editor window when double clicked." | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         if os.path.normcase(self.file[-3:]) != ".py": | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         if not os.path.exists(self.file): | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         file_open(self.file) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def IsExpandable(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Return True if Python (.py) file." | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         return os.path.normcase(self.file[-3:]) == ".py" | 
					
						
							| 
									
										
										
										
											2001-07-12 23:54:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |     def listchildren(self): | 
					
						
							|  |  |  |         "Return sequenced classes and functions in the module." | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         dir, base = os.path.split(self.file) | 
					
						
							|  |  |  |         name, ext = os.path.splitext(base) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         if os.path.normcase(ext) != ".py": | 
					
						
							|  |  |  |             return [] | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |             tree = pyclbr.readmodule_ex(name, [dir] + sys.path) | 
					
						
							| 
									
										
										
										
											2014-07-01 18:52:37 -04:00
										 |  |  |         except ImportError: | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |             return [] | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         return transform_children(tree, name) | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  | class ChildBrowserTreeItem(TreeItem): | 
					
						
							|  |  |  |     """Browser tree for child nodes within the module.
 | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |     Uses TreeItem as the basis for the structure of the tree. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |     def __init__(self, obj): | 
					
						
							|  |  |  |         "Create a TreeItem for a pyclbr class/function object." | 
					
						
							|  |  |  |         self.obj = obj | 
					
						
							|  |  |  |         self.name = obj.name | 
					
						
							|  |  |  |         self.isfunction = isinstance(obj, pyclbr.Function) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def GetText(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Return the name of the function/class to display." | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         name = self.name | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         if self.isfunction: | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |             return "def " + name + "(...)" | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |             return "class " + name | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def GetIconName(self): | 
					
						
							| 
									
										
										
										
											2017-07-11 02:34:01 -04:00
										 |  |  |         "Return the name of the icon to display." | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         if self.isfunction: | 
					
						
							|  |  |  |             return "python" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return "folder" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def IsExpandable(self): | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         "Return True if self.obj has nested objects." | 
					
						
							|  |  |  |         return self.obj.children != {} | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def GetSubList(self): | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         "Return ChildBrowserTreeItems for children." | 
					
						
							|  |  |  |         return [ChildBrowserTreeItem(obj) | 
					
						
							|  |  |  |                 for obj in transform_children(self.obj.children)] | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def OnDoubleClick(self): | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         "Open module with file_open and position to lineno." | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             edit = file_open(self.obj.file) | 
					
						
							|  |  |  |             edit.gotoline(self.obj.lineno) | 
					
						
							|  |  |  |         except (OSError, AttributeError): | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-23 16:46:01 -04:00
										 |  |  | def _module_browser(parent): # htest # | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     if len(sys.argv) > 1:  # If pass file on command line. | 
					
						
							|  |  |  |         file = sys.argv[1] | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         file = __file__ | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |         # Add nested objects for htest. | 
					
						
							| 
									
										
										
										
											2017-09-22 16:08:44 -04:00
										 |  |  |         class Nested_in_func(TreeNode): | 
					
						
							|  |  |  |             def nested_in_class(): pass | 
					
						
							|  |  |  |         def closure(): | 
					
						
							|  |  |  |             class Nested_in_closure: pass | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     ModuleBrowser(parent, file, _htest=True) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2017-09-30 19:54:28 -04:00
										 |  |  |     if len(sys.argv) == 1:  # If pass file on command line, unittest fails. | 
					
						
							|  |  |  |         from unittest import main | 
					
						
							|  |  |  |         main('idlelib.idle_test.test_browser', verbosity=2, exit=False) | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |     from idlelib.idle_test.htest import run | 
					
						
							| 
									
										
										
										
											2017-09-23 16:46:01 -04:00
										 |  |  |     run(_module_browser) |