[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