[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24165] trunk/blender/release/scripts: replacement for my own autocomplete module by stani

Campbell Barton ideasman42 at gmail.com
Thu Oct 29 21:55:45 CET 2009


Revision: 24165
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24165
Author:   campbellbarton
Date:     2009-10-29 21:55:45 +0100 (Thu, 29 Oct 2009)

Log Message:
-----------
replacement for my own autocomplete module by stani

--- from his patch
All the functionality is in the console
folder:
- intellisense.py: the central module which loads others on demand
- complete_namespace: more or less a replacement for the old autocomplete.py
- complete_import: module completion (I find this very handy, not just luxury)

These complete_* modules work very simple and should also work outside blender. You give some  input and it returns a list with possible completions.

autocomplete.py is now deprecated.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_console.py

Added Paths:
-----------
    trunk/blender/release/scripts/modules/console/
    trunk/blender/release/scripts/modules/console/__init__.py
    trunk/blender/release/scripts/modules/console/complete_import.py
    trunk/blender/release/scripts/modules/console/complete_namespace.py
    trunk/blender/release/scripts/modules/console/intellisense.py

Removed Paths:
-------------
    trunk/blender/release/scripts/modules/autocomplete.py

Deleted: trunk/blender/release/scripts/modules/autocomplete.py
===================================================================
--- trunk/blender/release/scripts/modules/autocomplete.py	2009-10-29 19:59:38 UTC (rev 24164)
+++ trunk/blender/release/scripts/modules/autocomplete.py	2009-10-29 20:55:45 UTC (rev 24165)
@@ -1,211 +0,0 @@
-
-
-def execute(bcon):
-	'''
-	This function has been taken from a BGE console autocomp I wrote a while ago
-	the dictionaty bcon is not needed but it means I can copy and paste from the old func
-	which works ok for now.
-	
-	'bcon' dictionary keys, set by the caller
-	* 'cursor' - index of the editing character (int)
-	* 'edit_text' - text string for editing (string)
-	* 'scrollback' - text to add to the scrollback, options are added here. (text)
-	* 'namespace' - namespace, (dictionary)
-	
-	'''
-	
-	
-	def is_delimiter(ch):
-		'''
-		For skipping words
-		'''
-		if ch == '_':
-			return False
-		if ch.isalnum():
-			return False
-		
-		return True
-	
-	def is_delimiter_autocomp(ch):
-		'''
-		When autocompleteing will earch back and 
-		'''
-		if ch in '._[] "\'':
-			return False
-		if ch.isalnum():
-			return False
-		
-		return True
-
-	
-	def do_autocomp(autocomp_prefix, autocomp_members):
-		'''
-		return text to insert and a list of options
-		'''
-		autocomp_members = [v for v in autocomp_members if v.startswith(autocomp_prefix)]
-		
-		print("AUTO: '%s'" % autocomp_prefix)
-		print("MEMBERS: '%s'" % str(autocomp_members))
-		
-		if not autocomp_prefix:
-			return '', autocomp_members
-		elif len(autocomp_members) > 1:
-			# find a common string between all members after the prefix 
-			# 'ge' [getA, getB, getC] --> 'get'
-			
-			# get the shortest member
-			min_len = min([len(v) for v in autocomp_members])
-			
-			autocomp_prefix_ret = ''
-			
-			for i in range(len(autocomp_prefix), min_len):
-				char_soup = set()
-				for v in autocomp_members:
-					char_soup.add(v[i])
-				
-				if len(char_soup) > 1:
-					break
-				else:
-					autocomp_prefix_ret += char_soup.pop()
-			
-			return autocomp_prefix_ret, autocomp_members
-		elif len(autocomp_members) == 1:
-			if autocomp_prefix == autocomp_members[0]:
-				# the variable matched the prefix exactly
-				# add a '.' so you can quickly continue.
-				# Could try add [] or other possible extensions rather then '.' too if we had the variable.
-				return '.', []
-			else:
-				# finish off the of the word word
-				return autocomp_members[0][len(autocomp_prefix):], []
-		else:
-			return '', []
-	
-
-	def BCon_PrevChar(bcon):
-		cursor = bcon['cursor']-1
-		if cursor<0:
-			return None
-			
-		try:
-			return bcon['edit_text'][cursor]
-		except:
-			return None
-		
-		
-	def BCon_NextChar(bcon):
-		try:
-			return bcon['edit_text'][bcon['cursor']]
-		except:
-			return None
-	
-	def BCon_cursorLeft(bcon):
-		bcon['cursor'] -= 1
-		if bcon['cursor'] < 0:
-			bcon['cursor'] = 0
-
-	def BCon_cursorRight(bcon):
-			bcon['cursor'] += 1
-			if bcon['cursor'] > len(bcon['edit_text']):
-				bcon['cursor'] = len(bcon['edit_text'])
-	
-	def BCon_AddScrollback(bcon, text):
-		
-		bcon['scrollback'] = bcon['scrollback'] + text
-		
-	
-	def BCon_cursorInsertChar(bcon, ch):
-		if bcon['cursor']==0:
-			bcon['edit_text'] = ch + bcon['edit_text']
-		elif bcon['cursor']==len(bcon['edit_text']):
-			bcon['edit_text'] = bcon['edit_text'] + ch
-		else:
-			bcon['edit_text'] = bcon['edit_text'][:bcon['cursor']] + ch + bcon['edit_text'][bcon['cursor']:]
-			
-		bcon['cursor'] 
-		if bcon['cursor'] > len(bcon['edit_text']):
-			bcon['cursor'] = len(bcon['edit_text'])
-		BCon_cursorRight(bcon)
-	
-	
-	TEMP_NAME = '___tempname___'
-	
-	cursor_orig = bcon['cursor']
-	
-	ch = BCon_PrevChar(bcon)
-	while ch != None and (not is_delimiter(ch)):
-		ch = BCon_PrevChar(bcon)
-		BCon_cursorLeft(bcon)
-	
-	if ch != None:
-		BCon_cursorRight(bcon)
-	
-	#print (cursor_orig, bcon['cursor'])
-	
-	cursor_base = bcon['cursor']
-	
-	autocomp_prefix = bcon['edit_text'][cursor_base:cursor_orig]
-	
-	print("PREFIX:'%s'" % autocomp_prefix)
-	
-	# Get the previous word
-	if BCon_PrevChar(bcon)=='.':
-		BCon_cursorLeft(bcon)
-		ch = BCon_PrevChar(bcon)
-		while ch != None and is_delimiter_autocomp(ch)==False:
-			ch = BCon_PrevChar(bcon)
-			BCon_cursorLeft(bcon)
-		
-		cursor_new = bcon['cursor']
-		
-		if ch != None:
-			cursor_new+=1
-		
-		pytxt = bcon['edit_text'][cursor_new:cursor_base-1].strip()
-		print("AUTOCOMP EVAL: '%s'" % pytxt)
-		#try:
-		if pytxt:
-			bcon['console'].runsource(TEMP_NAME + '=' + pytxt, '<input>', 'single')
-			# print val
-		else: ##except:
-			val = None
-		
-		try:
-			val = bcon['namespace'][TEMP_NAME]
-			del bcon['namespace'][TEMP_NAME]
-		except:
-			val = None
-		
-		if val:
-			autocomp_members = dir(val)
-			
-			autocomp_prefix_ret, autocomp_members = do_autocomp(autocomp_prefix, autocomp_members)
-			
-			bcon['cursor'] = cursor_orig
-			for v in autocomp_prefix_ret:
-				BCon_cursorInsertChar(bcon, v)
-			cursor_orig = bcon['cursor']
-			
-			if autocomp_members:
-				BCon_AddScrollback(bcon, ', '.join(autocomp_members))
-		
-		del val
-		
-	else:
-		# Autocomp global namespace
-		autocomp_members = bcon['namespace'].keys()
-		
-		if autocomp_prefix:
-			autocomp_members = [v for v in autocomp_members if v.startswith(autocomp_prefix)]
-		
-		autocomp_prefix_ret, autocomp_members = do_autocomp(autocomp_prefix, autocomp_members)
-		
-		bcon['cursor'] = cursor_orig
-		for v in autocomp_prefix_ret:
-			BCon_cursorInsertChar(bcon, v)
-		cursor_orig = bcon['cursor']
-		
-		if autocomp_members:
-			BCon_AddScrollback(bcon, ', '.join(autocomp_members))
-	
-	bcon['cursor'] = cursor_orig
\ No newline at end of file

Added: trunk/blender/release/scripts/modules/console/__init__.py
===================================================================
--- trunk/blender/release/scripts/modules/console/__init__.py	                        (rev 0)
+++ trunk/blender/release/scripts/modules/console/__init__.py	2009-10-29 20:55:45 UTC (rev 24165)
@@ -0,0 +1,16 @@
+# Copyright (c) 2009 www.stani.be (GPL license)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Package for console specific modules."""

Added: trunk/blender/release/scripts/modules/console/complete_import.py
===================================================================
--- trunk/blender/release/scripts/modules/console/complete_import.py	                        (rev 0)
+++ trunk/blender/release/scripts/modules/console/complete_import.py	2009-10-29 20:55:45 UTC (rev 24165)
@@ -0,0 +1,174 @@
+# Copyright (c) 2009 Fernando Perez, www.stani.be (GPL license)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Original copyright (see docstring):
+#*****************************************************************************
+#       Copyright (C) 2001-2006 Fernando Perez <fperez at colorado.edu>
+#
+#  Distributed under the terms of the BSD License.  The full license is in
+#  the file COPYING, distributed as part of this software.
+#*****************************************************************************
+
+"""Completer for import statements
+
+Original code was from IPython/Extensions/ipy_completers.py. The following
+changes have been made:
+- ported to python3
+- pep8 polishing
+- limit list of modules to prefix in case of "from w"
+- sorted modules
+- added sphinx documentation
+"""
+
+
+import os
+import sys
+
+TIMEOUT_STORAGE = 3  # Time in secs after which the rootmodules will be stored
+TIMEOUT_GIVEUP = 20  # Time in secs after which we give up
+
+ROOT_MODULES = None
+
+
+def get_root_modules():
+    """
+    Returns a list containing the names of all the modules available in the
+    folders of the pythonpath.
+
+    :returns: modules
+    :rtype: list
+    """
+    global ROOT_MODULES
+    modules = []
+    if not(ROOT_MODULES is None):
+        return ROOT_MODULES
+    from time import time
+    t = time()
+    store = False
+    for path in sys.path:
+        modules += module_list(path)
+        if time() - t >= TIMEOUT_STORAGE and not store:
+            # Caching the list of root modules, please wait!
+            store = True
+        if time() - t > TIMEOUT_GIVEUP:
+            # This is taking too long, we give up.
+            ROOT_MODULES = []
+            return []
+
+    modules += sys.builtin_module_names
+
+    modules = list(set(modules))
+    if '__init__' in modules:
+        modules.remove('__init__')
+    modules = sorted(set(modules))
+    if store:
+        ROOT_MODULES = modules
+    return modules
+
+
+def module_list(path):
+    """
+    Return the list containing the names of the modules available in
+    the given folder.
+
+    :param path: folder path
+    :type path: str
+    :returns: modules
+    :rtype: list
+    """
+
+    if os.path.isdir(path):
+        folder_list = os.listdir(path)
+    elif path.endswith('.egg'):
+        from zipimport import zipimporter
+        try:
+            folder_list = [f for f in zipimporter(path)._files]
+        except:
+            folder_list = []
+    else:
+        folder_list = []
+    #folder_list = glob.glob(os.path.join(path,'*'))
+    folder_list = [p for p in folder_list  \
+       if os.path.exists(os.path.join(path, p, '__init__.py'))\
+           or p[-3:] in ('.py', '.so')\
+           or p[-4:] in ('.pyc', '.pyo', '.pyd')]
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list