diff --git a/IPython/Magic.py b/IPython/Magic.py index 6c0c488..f1c0162 100644 --- a/IPython/Magic.py +++ b/IPython/Magic.py @@ -2728,8 +2728,7 @@ Defaulting color scheme to 'NoColor'""" os.chdir(os.path.expanduser(ps)) if self.shell.rc.term_title: #print 'set term title:',self.shell.rc.term_title # dbg - ttitle = 'IPy ' + abbrev_cwd() - platutils.set_term_title(ttitle) + platutils.set_term_title('IPy ' + abbrev_cwd()) except OSError: print sys.exc_info()[1] else: @@ -3195,7 +3194,7 @@ Defaulting color scheme to 'NoColor'""" exec b in self.user_ns self.user_ns['pasted_block'] = b else: - self.user_ns[par] = block + self.user_ns[par] = SList(block.splitlines()) print "Block assigned to '%s'" % par def magic_quickref(self,arg): diff --git a/IPython/Release.py b/IPython/Release.py index f46c4a5..adef323 100644 --- a/IPython/Release.py +++ b/IPython/Release.py @@ -22,15 +22,19 @@ name = 'ipython' # because bdist_rpm does not accept dashes (an RPM) convention, and # bdist_deb does not accept underscores (a Debian convention). -revision = '1016' +development = True # change this to False to do a release +version_base = '0.9.0' branch = 'ipython' +revision = '1016' -if branch == 'ipython': - version = '0.9.0.bzr.r' + revision +if development: + if branch == 'ipython': + version = '%s.bzr.r%s' % (version_base, revision) + else: + version = '%s.bzr.r%s.%s' % (version_base, revision, branch) else: - version = '0.9.0.bzr.r%s.%s' % (revision,branch) + version = version_base -# version = '0.8.4' description = "Tools for interactive development in Python." diff --git a/IPython/external/mglob.py b/IPython/external/mglob.py index f5e436c..3810f32 100644 --- a/IPython/external/mglob.py +++ b/IPython/external/mglob.py @@ -53,7 +53,7 @@ globsyntax = """\ - readme*, exclude files ending with .bak !.svn/ !.hg/ !*_Data/ rec:. - Skip .svn, .hg, foo_Data dirs (and their subdirs) in recurse. - Trailing / is the key, \ does not work! + Trailing / is the key, \ does not work! Use !.*/ for all hidden. dir:foo - the directory foo if it exists (not files in foo) dir:* @@ -63,13 +63,16 @@ globsyntax = """\ foo.py is *not* included twice. @filelist.txt - All files listed in 'filelist.txt' file, on separate lines. + "cont:class \wak:" rec:*.py + - Match files containing regexp. Applies to subsequent files. + note quotes because of whitespace. """ __version__ = "0.2" -import os,glob,fnmatch,sys +import os,glob,fnmatch,sys,re from sets import Set as set @@ -84,21 +87,34 @@ def expand(flist,exp_dirs = False): """ if isinstance(flist, basestring): - flist = flist.split() + import shlex + flist = shlex.split(flist) done_set = set() denied_set = set() - + cont_set = set() + cur_rejected_dirs = set() + def recfind(p, pats = ["*"]): - denied_dirs = ["*" + d+"*" for d in denied_set if d.endswith("/")] - #print "de", denied_dirs + denied_dirs = [os.path.dirname(d) for d in denied_set if d.endswith("/")] for (dp,dnames,fnames) in os.walk(p): # see if we should ignore the whole directory dp_norm = dp.replace("\\","/") + "/" deny = False + # do not traverse under already rejected dirs + for d in cur_rejected_dirs: + if dp.startswith(d): + deny = True + break + if deny: + continue + + #print "dp",dp + bname = os.path.basename(dp) for deny_pat in denied_dirs: - if fnmatch.fnmatch( dp_norm, deny_pat): + if fnmatch.fnmatch( bname, deny_pat): deny = True + cur_rejected_dirs.add(dp) break if deny: continue @@ -124,6 +140,17 @@ def expand(flist,exp_dirs = False): if fnmatch.fnmatch(os.path.basename(p), deny_pat): deny = True break + if cont_set: + try: + cont = open(p).read() + except IOError: + # deny + continue + for pat in cont_set: + if not re.search(pat,cont, re.IGNORECASE): + deny = True + break + if not deny: yield it return @@ -158,7 +185,8 @@ def expand(flist,exp_dirs = False): # glob only dirs elif ent.lower().startswith('dir:'): res.extend(once_filter(filter(os.path.isdir,glob.glob(ent[4:])))) - + elif ent.lower().startswith('cont:'): + cont_set.add(ent[5:]) # get all files in the specified dir elif os.path.isdir(ent) and exp_dirs: res.extend(once_filter(filter(os.path.isfile,glob.glob(ent + os.sep+"*")))) diff --git a/IPython/frontend/cocoa/.DS_Store b/IPython/frontend/cocoa/.DS_Store deleted file mode 100644 index f3571106fff38a8ee1ba7107a78f46b26eb6745c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@v|D_ISKQ&L zKYvk_i>|OGCiaQI#1$0qhM9^bF4b@|ei`S!!Qgb+fAb0yxU$S+S@ zh7jTp(w+~V4s;!Dj3;!~o8xFt2fB_n<|TAS=d`0e9q2lmhnBJVFz#&ZP|VSu4!`str(value)) waitingForEngine = objc.ivar().bool() textView = objc.IBOutlet() def init(self): self = super(IPythonCocoaController, self).init() - FrontEndBase.__init__(self, engine=ThreadedEngineService()) + AsyncFrontEndBase.__init__(self, + engine=AutoreleasePoolWrappedThreadedEngineService()) if(self != None): self._common_init() @@ -133,13 +175,43 @@ class IPythonCocoaController(NSObject, FrontEndBase): def execute(self, block, blockID=None): self.waitingForEngine = True self.willChangeValueForKey_('commandHistory') - d = super(IPythonCocoaController, self).execute(block, blockID) + d = super(IPythonCocoaController, self).execute(block, + blockID) d.addBoth(self._engine_done) d.addCallback(self._update_user_ns) return d + + def push_(self, namespace): + """Push dictionary of key=>values to python namespace""" + self.waitingForEngine = True + self.willChangeValueForKey_('commandHistory') + d = self.engine.push(namespace) + d.addBoth(self._engine_done) + d.addCallback(self._update_user_ns) + + + def pull_(self, keys): + """Pull keys from python namespace""" + + self.waitingForEngine = True + result = blockingCallFromThread(self.engine.pull, keys) + self.waitingForEngine = False + + @objc.signature('v@:@I') + def executeFileAtPath_encoding_(self, path, encoding): + """Execute file at path in an empty namespace. Update the engine + user_ns with the resulting locals.""" + + lines,err = NSString.stringWithContentsOfFile_encoding_error_( + path, + encoding, + None) + self.engine.execute(lines) + + def _engine_done(self, x): self.waitingForEngine = False self.didChangeValueForKey_('commandHistory') @@ -166,14 +238,14 @@ class IPythonCocoaController(NSObject, FrontEndBase): self.didChangeValueForKey_('userNS') - def update_cell_prompt(self, result): + def update_cell_prompt(self, result, blockID=None): if(isinstance(result, Failure)): - blockID = result.blockID + self.insert_text(self.input_prompt(), + textRange=NSMakeRange(self.blockRanges[blockID].location,0), + scrollToVisible=False + ) else: - blockID = result['blockID'] - - - self.insert_text(self.input_prompt(result=result), + self.insert_text(self.input_prompt(number=result['number']), textRange=NSMakeRange(self.blockRanges[blockID].location,0), scrollToVisible=False ) @@ -188,7 +260,7 @@ class IPythonCocoaController(NSObject, FrontEndBase): #print inputRange,self.current_block_range() self.insert_text('\n' + - self.output_prompt(result) + + self.output_prompt(number=result['number']) + result.get('display',{}).get('pprint','') + '\n\n', textRange=NSMakeRange(inputRange.location+inputRange.length, @@ -197,7 +269,11 @@ class IPythonCocoaController(NSObject, FrontEndBase): def render_error(self, failure): - self.insert_text('\n\n'+str(failure)+'\n\n') + self.insert_text('\n' + + self.output_prompt() + + '\n' + + failure.getErrorMessage() + + '\n\n') self.start_new_block() return failure @@ -288,9 +364,13 @@ class IPythonCocoaController(NSObject, FrontEndBase): def current_indent_string(self): """returns string for indent or None if no indent""" - if(len(self.current_block()) > 0): - lines = self.current_block().split('\n') - currentIndent = len(lines[-1]) - len(lines[-1]) + return self._indent_for_block(self.current_block()) + + + def _indent_for_block(self, block): + lines = block.split('\n') + if(len(lines) > 1): + currentIndent = len(lines[-1]) - len(lines[-1].lstrip()) if(currentIndent == 0): currentIndent = self.tabSpaces diff --git a/IPython/frontend/cocoa/examples/.DS_Store b/IPython/frontend/cocoa/examples/.DS_Store deleted file mode 100644 index 33fb2cc3638425cba746b55723dba38a5c9cbc37..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@B+CV*HgKrHHah zq4Ol`CGyyDW)XV=Kuz!S319%Eh*sfZ2Ps<*O($XS+Z+WvDon7z_3pV2jrLsa+b;5DpXjEj z3%~Ai|1@0w1VIplzen7Zke&{^3_%bMknnx5w4>W-#ePjEpT-#4(vEJU72`CW&?#+b zOFO!a=0{7h_)vWEws=v7wzT`zD+|KWFp4r^|G)UY{ucz{AET1lVm8HlLC_=YwYFO`=QZPnjw0ZPB-q2!=C)D^n-)qEBJ3)mHy!KV6^b`wGfA;eFZt9ZQaYX~9!AjAF;=|p#KAAOVmNDKAJ5F$ aeHUK12xR`laEfDIq!Zn_br}%i7VH55gce!= diff --git a/IPython/frontend/cocoa/plugin/CocoaFrontendPlugin.xcodeproj/project.pbxproj b/IPython/frontend/cocoa/plugin/CocoaFrontendPlugin.xcodeproj/project.pbxproj new file mode 100644 index 0000000..525d6ef --- /dev/null +++ b/IPython/frontend/cocoa/plugin/CocoaFrontendPlugin.xcodeproj/project.pbxproj @@ -0,0 +1,256 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXContainerItemProxy section */ + 4C5B7ADB0E1A0BCD006CB905 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4C96F4FE0E199AB500B03430 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4C96F50C0E199AF100B03430; + remoteInfo = "Cocoa Frontend Plugin"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 4C5B7A8D0E1A0B4C006CB905 /* Plugin-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Plugin-Info.plist"; sourceTree = ""; }; + 4C5B7AD30E1A0BC8006CB905 /* Placeholder (Do Not Use).bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Placeholder (Do Not Use).bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C5B7AD40E1A0BC8006CB905 /* Placeholder (Do Not Use)-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Placeholder (Do Not Use)-Info.plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4C5B7AD10E1A0BC8006CB905 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4C5B7A8C0E1A0B4C006CB905 /* Products */ = { + isa = PBXGroup; + children = ( + 4C5B7AD30E1A0BC8006CB905 /* Placeholder (Do Not Use).bundle */, + ); + name = Products; + sourceTree = ""; + }; + 4C96F4FC0E199AB500B03430 = { + isa = PBXGroup; + children = ( + 4C5B7A8C0E1A0B4C006CB905 /* Products */, + 4C5B7A8D0E1A0B4C006CB905 /* Plugin-Info.plist */, + 4C5B7AD40E1A0BC8006CB905 /* Placeholder (Do Not Use)-Info.plist */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "$(ACTION)"; + buildConfigurationList = 4C96F5110E199B3300B03430 /* Build configuration list for PBXLegacyTarget "Cocoa Frontend Plugin" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/make; + buildWorkingDirectory = ""; + dependencies = ( + ); + name = "Cocoa Frontend Plugin"; + passBuildSettingsInEnvironment = 1; + productName = "Cocoa Frontend Plugin"; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 4C5B7AD20E1A0BC8006CB905 /* Placeholder (Do Not Use) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4C5B7ADA0E1A0BC9006CB905 /* Build configuration list for PBXNativeTarget "Placeholder (Do Not Use)" */; + buildPhases = ( + 4C5B7ACF0E1A0BC8006CB905 /* Resources */, + 4C5B7AD00E1A0BC8006CB905 /* Sources */, + 4C5B7AD10E1A0BC8006CB905 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 4C5B7ADC0E1A0BCD006CB905 /* PBXTargetDependency */, + ); + name = "Placeholder (Do Not Use)"; + productName = "Placeholder (Do Not Use)"; + productReference = 4C5B7AD30E1A0BC8006CB905 /* Placeholder (Do Not Use).bundle */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4C96F4FE0E199AB500B03430 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 4C96F5010E199AB500B03430 /* Build configuration list for PBXProject "CocoaFrontendPlugin" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 0; + mainGroup = 4C96F4FC0E199AB500B03430; + productRefGroup = 4C5B7A8C0E1A0B4C006CB905 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */, + 4C5B7AD20E1A0BC8006CB905 /* Placeholder (Do Not Use) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4C5B7ACF0E1A0BC8006CB905 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4C5B7AD00E1A0BC8006CB905 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4C5B7ADC0E1A0BCD006CB905 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */; + targetProxy = 4C5B7ADB0E1A0BCD006CB905 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4C5B7AD50E1A0BC9006CB905 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "Placeholder (Do Not Use)-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = "Placeholder (Do Not Use)"; + WRAPPER_EXTENSION = bundle; + ZERO_LINK = YES; + }; + name = Debug; + }; + 4C5B7AD60E1A0BC9006CB905 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "Placeholder (Do Not Use)-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = "Placeholder (Do Not Use)"; + WRAPPER_EXTENSION = bundle; + ZERO_LINK = NO; + }; + name = Release; + }; + 4C96F4FF0E199AB500B03430 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + }; + name = Debug; + }; + 4C96F5000E199AB500B03430 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + }; + name = Release; + }; + 4C96F50D0E199AF100B03430 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = "Cocoa Frontend Plugin"; + }; + name = Debug; + }; + 4C96F50E0E199AF100B03430 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = "Cocoa Frontend Plugin"; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4C5B7ADA0E1A0BC9006CB905 /* Build configuration list for PBXNativeTarget "Placeholder (Do Not Use)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4C5B7AD50E1A0BC9006CB905 /* Debug */, + 4C5B7AD60E1A0BC9006CB905 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4C96F5010E199AB500B03430 /* Build configuration list for PBXProject "CocoaFrontendPlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4C96F4FF0E199AB500B03430 /* Debug */, + 4C96F5000E199AB500B03430 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4C96F5110E199B3300B03430 /* Build configuration list for PBXLegacyTarget "Cocoa Frontend Plugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4C96F50D0E199AF100B03430 /* Debug */, + 4C96F50E0E199AF100B03430 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4C96F4FE0E199AB500B03430 /* Project object */; +} diff --git a/IPython/frontend/cocoa/plugin/IPythonCocoaFrontendLoader.py b/IPython/frontend/cocoa/plugin/IPythonCocoaFrontendLoader.py new file mode 100644 index 0000000..a3b5478 --- /dev/null +++ b/IPython/frontend/cocoa/plugin/IPythonCocoaFrontendLoader.py @@ -0,0 +1,25 @@ +# encoding: utf-8 +""" +Provides a namespace for loading the Cocoa frontend via a Cocoa plugin. + +Author: Barry Wark +""" +__docformat__ = "restructuredtext en" + +#----------------------------------------------------------------------------- +# Copyright (C) 2008 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +from PyObjCTools import AppHelper +from twisted.internet import _threadedselect + +#make sure _threadedselect is installed first +reactor = _threadedselect.install() + +# load the Cocoa frontend controller +from IPython.frontend.cocoa.cocoa_frontend import IPythonCocoaController +reactor.interleave(AppHelper.callAfter) +assert(reactor.running) diff --git a/IPython/frontend/cocoa/plugin/Makefile b/IPython/frontend/cocoa/plugin/Makefile new file mode 100644 index 0000000..109d8bf --- /dev/null +++ b/IPython/frontend/cocoa/plugin/Makefile @@ -0,0 +1,6 @@ +include ./plugins.mk + +all : dist/IPythonCocoaController.plugin + +dist/IPythonCocoaController.plugin : ./IPythonCocoaFrontendLoader.py\ + ./setup.py \ No newline at end of file diff --git a/IPython/frontend/cocoa/plugin/Placeholder (Do Not Use)-Info.plist b/IPython/frontend/cocoa/plugin/Placeholder (Do Not Use)-Info.plist new file mode 100644 index 0000000..01fd88b --- /dev/null +++ b/IPython/frontend/cocoa/plugin/Placeholder (Do Not Use)-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.yourcompany.Placeholder (Do Not Use) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/IPython/frontend/cocoa/plugin/plugins.mk b/IPython/frontend/cocoa/plugin/plugins.mk new file mode 100644 index 0000000..2df61f0 --- /dev/null +++ b/IPython/frontend/cocoa/plugin/plugins.mk @@ -0,0 +1,21 @@ +%.plugin:: + rm -rf dist/$(notdir $@) + rm -rf build dist && \ + python setup.py py2app -s + +%.py: + @echo "test -f $@" + @test -f %@ + +%.nib: + @echo "test -f $@" + @test -f %@ + +.DEFAULT_GOAL := all + +.PHONY : all clean + +clean : + rm -rf build dist + + diff --git a/IPython/frontend/cocoa/plugin/setup.py b/IPython/frontend/cocoa/plugin/setup.py new file mode 100644 index 0000000..8393085 --- /dev/null +++ b/IPython/frontend/cocoa/plugin/setup.py @@ -0,0 +1,35 @@ +# encoding: utf-8 +""" +setup.py + +Setuptools installer script for generating a Cocoa plugin for the +IPython cocoa frontend + +Author: Barry Wark +""" +__docformat__ = "restructuredtext en" + +#----------------------------------------------------------------------------- +# Copyright (C) 2008 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +from setuptools import setup + +infoPlist = dict( + CFBundleDevelopmentRegion='English', + CFBundleIdentifier='org.scipy.ipython.cocoa_frontend', + NSPrincipalClass='IPythonCocoaController', +) + +setup( + plugin=['IPythonCocoaFrontendLoader.py'], + setup_requires=['py2app'], + options=dict(py2app=dict( + plist=infoPlist, + site_packages=True, + excludes=['IPython','twisted','PyObjCTools'] + )), +) \ No newline at end of file diff --git a/IPython/frontend/cocoa/tests/test_cocoa_frontend.py b/IPython/frontend/cocoa/tests/test_cocoa_frontend.py index eb4ae43..d85728d 100644 --- a/IPython/frontend/cocoa/tests/test_cocoa_frontend.py +++ b/IPython/frontend/cocoa/tests/test_cocoa_frontend.py @@ -70,3 +70,22 @@ class TestIPythonCocoaControler(DeferredTestCase): self.controller.execute(code).addCallback(testCompletes) + + def testCurrentIndent(self): + """test that current_indent_string returns current indent or None. + Uses _indent_for_block for direct unit testing. + """ + + self.controller.tabUsesSpaces = True + self.assert_(self.controller._indent_for_block("""a=3""") == None) + self.assert_(self.controller._indent_for_block("") == None) + block = """def test():\n a=3""" + self.assert_(self.controller._indent_for_block(block) == \ + ' ' * self.controller.tabSpaces) + + block = """if(True):\n%sif(False):\n%spass""" % \ + (' '*self.controller.tabSpaces, + 2*' '*self.controller.tabSpaces) + self.assert_(self.controller._indent_for_block(block) == \ + 2*(' '*self.controller.tabSpaces)) + diff --git a/IPython/frontend/frontendbase.py b/IPython/frontend/frontendbase.py index 644166a..e9c8fbb 100644 --- a/IPython/frontend/frontendbase.py +++ b/IPython/frontend/frontendbase.py @@ -24,13 +24,24 @@ import string import uuid import _ast -import zope.interface as zi +try: + from zope.interface import Interface, Attribute, implements, classProvides +except ImportError: + #zope.interface is not available + Interface = object + def Attribute(name, doc): pass + def implements(interface): pass + def classProvides(interface): pass from IPython.kernel.core.history import FrontEndHistory from IPython.kernel.core.util import Bunch from IPython.kernel.engineservice import IEngineCore -from twisted.python.failure import Failure +try: + from twisted.python.failure import Failure +except ImportError: + #Twisted not available + Failure = Exception ############################################################################## # TEMPORARY!!! fake configuration, while we decide whether to use tconfig or @@ -43,7 +54,7 @@ rc.prompt_out = r'Out [$number]: ' ############################################################################## -class IFrontEndFactory(zi.Interface): +class IFrontEndFactory(Interface): """Factory interface for frontends.""" def __call__(engine=None, history=None): @@ -56,33 +67,30 @@ class IFrontEndFactory(zi.Interface): -class IFrontEnd(zi.Interface): +class IFrontEnd(Interface): """Interface for frontends. All methods return t.i.d.Deferred""" - zi.Attribute("input_prompt_template", "string.Template instance\ + Attribute("input_prompt_template", "string.Template instance\ substituteable with execute result.") - zi.Attribute("output_prompt_template", "string.Template instance\ + Attribute("output_prompt_template", "string.Template instance\ substituteable with execute result.") - zi.Attribute("continuation_prompt_template", "string.Template instance\ + Attribute("continuation_prompt_template", "string.Template instance\ substituteable with execute result.") - def update_cell_prompt(self, result): + def update_cell_prompt(result, blockID=None): """Subclass may override to update the input prompt for a block. Since this method will be called as a - twisted.internet.defer.Deferred's callback, + twisted.internet.defer.Deferred's callback/errback, implementations should return result when finished. - NB: result is a failure if the execute returned a failre. - To get the blockID, you should do something like:: - if(isinstance(result, twisted.python.failure.Failure)): - blockID = result.blockID - else: - blockID = result['blockID'] + Result is a result dict in case of success, and a + twisted.python.util.failure.Failure in case of an error """ pass - def render_result(self, result): + + def render_result(result): """Render the result of an execute call. Implementors may choose the method of rendering. For example, a notebook-style frontend might render a Chaco plot @@ -90,6 +98,7 @@ class IFrontEnd(zi.Interface): Parameters: result : dict (result of IEngineBase.execute ) + blockID = result['blockID'] Result: Output of frontend rendering @@ -97,22 +106,24 @@ class IFrontEnd(zi.Interface): pass - def render_error(self, failure): + def render_error(failure): """Subclasses must override to render the failure. Since this method - ill be called as a twisted.internet.defer.Deferred's callback, + will be called as a twisted.internet.defer.Deferred's callback, implementations should return result when finished. + + blockID = failure.blockID """ pass - def input_prompt(result={}): + def input_prompt(number=''): """Returns the input prompt by subsituting into self.input_prompt_template """ pass - def output_prompt(result): + def output_prompt(number=''): """Returns the output prompt by subsituting into self.output_prompt_template """ @@ -159,9 +170,6 @@ class FrontEndBase(object): - How do we handle completions? """ - zi.implements(IFrontEnd) - zi.classProvides(IFrontEndFactory) - history_cursor = 0 current_indent_level = 0 @@ -171,24 +179,20 @@ class FrontEndBase(object): output_prompt_template = string.Template(rc.prompt_out) continuation_prompt_template = string.Template(rc.prompt_in2) - def __init__(self, engine=None, history=None): - assert(engine==None or IEngineCore.providedBy(engine)) - self.engine = IEngineCore(engine) + def __init__(self, shell=None, history=None): + self.shell = shell if history is None: self.history = FrontEndHistory(input_cache=['']) else: self.history = history - def input_prompt(self, result={}): + def input_prompt(self, number=''): """Returns the current input prompt It would be great to use ipython1.core.prompts.Prompt1 here """ - - result.setdefault('number','') - - return self.input_prompt_template.safe_substitute(result) + return self.input_prompt_template.safe_substitute({'number':number}) def continuation_prompt(self): @@ -196,10 +200,10 @@ class FrontEndBase(object): return self.continuation_prompt_template.safe_substitute() - def output_prompt(self, result): + def output_prompt(self, number=''): """Returns the output prompt for result""" - return self.output_prompt_template.safe_substitute(result) + return self.output_prompt_template.safe_substitute({'number':number}) def is_complete(self, block): @@ -239,7 +243,7 @@ class FrontEndBase(object): def execute(self, block, blockID=None): - """Execute the block and return result. + """Execute the block and return the result. Parameters: block : {str, AST} @@ -252,32 +256,41 @@ class FrontEndBase(object): """ if(not self.is_complete(block)): - return Failure(Exception("Block is not compilable")) + raise Exception("Block is not compilable") if(blockID == None): blockID = uuid.uuid4() #random UUID - d = self.engine.execute(block) - d.addCallback(self._add_history, block=block) - d.addBoth(self._add_block_id, blockID) - d.addBoth(self.update_cell_prompt) - d.addCallbacks(self.render_result, errback=self.render_error) + try: + result = self.shell.execute(block) + except Exception,e: + e = self._add_block_id_for_failure(e, blockID=blockID) + e = self.update_cell_prompt(e, blockID=blockID) + e = self.render_error(e) + else: + result = self._add_block_id_for_result(result, blockID=blockID) + result = self.update_cell_prompt(result, blockID=blockID) + result = self.render_result(result) - return d + return result - def _add_block_id(self, result, blockID): + def _add_block_id_for_result(self, result, blockID): """Add the blockID to result or failure. Unfortunatley, we have to treat failures differently than result dicts. """ - if(isinstance(result, Failure)): - result.blockID = blockID - else: - result['blockID'] = blockID + result['blockID'] = blockID return result + def _add_block_id_for_failure(self, failure, blockID): + """_add_block_id_for_failure""" + + failure.blockID = blockID + return failure + + def _add_history(self, result, block=None): """Add block to the history""" @@ -313,20 +326,11 @@ class FrontEndBase(object): # Subclasses probably want to override these methods... ### - def update_cell_prompt(self, result): + def update_cell_prompt(self, result, blockID=None): """Subclass may override to update the input prompt for a block. Since this method will be called as a twisted.internet.defer.Deferred's callback, implementations should return result when finished. - - NB: result is a failure if the execute returned a failre. - To get the blockID, you should do something like:: - if(isinstance(result, twisted.python.failure.Failure)): - blockID = result.blockID - else: - blockID = result['blockID'] - - """ return result @@ -344,9 +348,60 @@ class FrontEndBase(object): def render_error(self, failure): """Subclasses must override to render the failure. Since this method will be called as a twisted.internet.defer.Deferred's callback, - implementations should return result when finished.""" + implementations should return result when finished. + """ return failure +class AsyncFrontEndBase(FrontEndBase): + """ + Overrides FrontEndBase to wrap execute in a deferred result. + All callbacks are made as callbacks on the deferred result. + """ + + implements(IFrontEnd) + classProvides(IFrontEndFactory) + + def __init__(self, engine=None, history=None): + assert(engine==None or IEngineCore.providedBy(engine)) + self.engine = IEngineCore(engine) + if history is None: + self.history = FrontEndHistory(input_cache=['']) + else: + self.history = history + + + def execute(self, block, blockID=None): + """Execute the block and return the deferred result. + + Parameters: + block : {str, AST} + blockID : any + Caller may provide an ID to identify this block. + result['blockID'] := blockID + + Result: + Deferred result of self.interpreter.execute + """ + + if(not self.is_complete(block)): + return Failure(Exception("Block is not compilable")) + + if(blockID == None): + blockID = uuid.uuid4() #random UUID + + d = self.engine.execute(block) + d.addCallback(self._add_history, block=block) + d.addCallbacks(self._add_block_id_for_result, + errback=self._add_block_id_for_failure, + callbackArgs=(blockID,), + errbackArgs=(blockID,)) + d.addBoth(self.update_cell_prompt, blockID=blockID) + d.addCallbacks(self.render_result, + errback=self.render_error) + + return d + + diff --git a/IPython/frontend/tests/test_frontendbase.py b/IPython/frontend/tests/test_frontendbase.py index 451e302..f74c43e 100644 --- a/IPython/frontend/tests/test_frontendbase.py +++ b/IPython/frontend/tests/test_frontendbase.py @@ -19,7 +19,7 @@ import unittest from IPython.frontend import frontendbase from IPython.kernel.engineservice import EngineService -class FrontEndCallbackChecker(frontendbase.FrontEndBase): +class FrontEndCallbackChecker(frontendbase.AsyncFrontEndBase): """FrontEndBase subclass for checking callbacks""" def __init__(self, engine=None, history=None): super(FrontEndCallbackChecker, self).__init__(engine=engine, @@ -28,7 +28,7 @@ class FrontEndCallbackChecker(frontendbase.FrontEndBase): self.renderResultCalled = False self.renderErrorCalled = False - def update_cell_prompt(self, result): + def update_cell_prompt(self, result, blockID=None): self.updateCalled = True return result @@ -44,7 +44,7 @@ class FrontEndCallbackChecker(frontendbase.FrontEndBase): -class TestFrontendBase(unittest.TestCase): +class TestAsyncFrontendBase(unittest.TestCase): def setUp(self): """Setup the EngineService and FrontEndBase""" @@ -53,7 +53,7 @@ class TestFrontendBase(unittest.TestCase): def test_implements_IFrontEnd(self): assert(frontendbase.IFrontEnd.implementedBy( - frontendbase.FrontEndBase)) + frontendbase.AsyncFrontEndBase)) def test_is_complete_returns_False_for_incomplete_block(self): diff --git a/IPython/genutils.py b/IPython/genutils.py index 4bc418d..eb11efe 100644 --- a/IPython/genutils.py +++ b/IPython/genutils.py @@ -1137,14 +1137,41 @@ class SList(list): res.append(" ".join(lineparts)) return res - - - + def sort(self,field= None, nums = False): + """ sort by specified fields (see fields()) + + Example:: + a.sort(1, nums = True) + + Sorts a by second field, in numerical order (so that 21 > 3) + + """ + #decorate, sort, undecorate + if field is not None: + dsu = [[SList([line]).fields(field), line] for line in self] + else: + dsu = [[line, line] for line in self] + if nums: + for i in range(len(dsu)): + numstr = "".join([ch for ch in dsu[i][0] if ch.isdigit()]) + try: + n = int(numstr) + except ValueError: + n = 0; + dsu[i][0] = n + + + dsu.sort() + return SList([t[1] for t in dsu]) def print_slist(arg): """ Prettier (non-repr-like) and more informative printer for SList """ - print "SList (.p, .n, .l, .s, .grep(), .fields() available). Value:" + print "SList (.p, .n, .l, .s, .grep(), .fields(), sort() available):" + if hasattr(arg, 'hideonce') and arg.hideonce: + arg.hideonce = False + return + nlprint(arg) print_slist = result_display.when_type(SList)(print_slist) diff --git a/IPython/kernel/scripts/ipcluster.py b/IPython/kernel/scripts/ipcluster.py index 5f5795d..afcd53d 100755 --- a/IPython/kernel/scripts/ipcluster.py +++ b/IPython/kernel/scripts/ipcluster.py @@ -168,8 +168,7 @@ def startMsg(control_host,control_port=10105): print 'For interactive use, you can make a MultiEngineClient with:' print print 'from IPython.kernel import client' - print "mec = client.MultiEngineClient((%r,%s))" % \ - (control_host,control_port) + print "mec = client.MultiEngineClient()" print print 'You can then cleanly stop the cluster from IPython using:' print @@ -191,16 +190,18 @@ def clusterLocal(opt,arg): logfile = pjoin(logdir_base,'ipcluster-') print 'Starting controller:', - controller = Popen(['ipcontroller','--logfile',logfile]) + controller = Popen(['ipcontroller','--logfile',logfile,'-x','-y']) print 'Controller PID:',controller.pid print 'Starting engines: ', - time.sleep(3) + time.sleep(5) englogfile = '%s%s-' % (logfile,controller.pid) mpi = opt.mpi if mpi: # start with mpi - killing the engines with sigterm will not work if you do this - engines = [Popen(['mpirun', '-np', str(opt.n), 'ipengine', '--mpi', mpi, '--logfile',englogfile])] + engines = [Popen(['mpirun', '-np', str(opt.n), 'ipengine', '--mpi', + mpi, '--logfile',englogfile])] + # engines = [Popen(['mpirun', '-np', str(opt.n), 'ipengine', '--mpi', mpi])] else: # do what we would normally do engines = [ Popen(['ipengine','--logfile',englogfile]) for i in range(opt.n) ] diff --git a/IPython/kernel/scripts/ipengine.py b/IPython/kernel/scripts/ipengine.py index 9f02ea1..ca5bcba 100755 --- a/IPython/kernel/scripts/ipengine.py +++ b/IPython/kernel/scripts/ipengine.py @@ -58,12 +58,14 @@ def start_engine(): kernel_config = kernel_config_manager.get_config_obj() core_config = core_config_manager.get_config_obj() + # Execute the mpi import statement that needs to call MPI_Init + global mpi mpikey = kernel_config['mpi']['default'] mpi_import_statement = kernel_config['mpi'].get(mpikey, None) if mpi_import_statement is not None: try: - exec mpi_import_statement in locals(), globals() + exec mpi_import_statement in globals() except: mpi = None else: diff --git a/IPython/platutils.py b/IPython/platutils.py index 839e1b8..7f84769 100644 --- a/IPython/platutils.py +++ b/IPython/platutils.py @@ -3,13 +3,8 @@ Importing this module should give you the implementations that are correct for your operation system, from platutils_PLATFORMNAME module. - -$Id: ipstruct.py 1005 2006-01-12 08:39:26Z fperez $ - - """ - #***************************************************************************** # Copyright (C) 2001-2006 Fernando Perez # @@ -21,15 +16,32 @@ from IPython import Release __author__ = '%s <%s>' % Release.authors['Ville'] __license__ = Release.license -import os,sys +import os +import sys +# Import the platform-specific implementations if os.name == 'posix': - from platutils_posix import * + import platutils_posix as _platutils elif sys.platform == 'win32': - from platutils_win32 import * + import platutils_win32 as _platutils else: - from platutils_dummy import * + import platutils_dummy as _platutils import warnings warnings.warn("Platutils not available for platform '%s', some features may be missing" % os.name) del warnings + + +# Functionality that's logically common to all platforms goes here, each +# platform-specific module only provides the bits that are OS-dependent. + +def freeze_term_title(): + _platutils.ignore_termtitle = True + + +def set_term_title(title): + """Set terminal title using the necessary platform-dependent calls.""" + + if _platutils.ignore_termtitle: + return + _platutils.set_term_title(title) diff --git a/IPython/platutils_dummy.py b/IPython/platutils_dummy.py index 149acb9..86dc990 100644 --- a/IPython/platutils_dummy.py +++ b/IPython/platutils_dummy.py @@ -3,13 +3,8 @@ This has empty implementation of the platutils functions, used for unsupported operating systems. - -$Id: ipstruct.py 1005 2006-01-12 08:39:26Z fperez $ - - """ - #***************************************************************************** # Copyright (C) 2001-2006 Fernando Perez # @@ -21,9 +16,9 @@ from IPython import Release __author__ = '%s <%s>' % Release.authors['Ville'] __license__ = Release.license +# This variable is part of the expected API of the module: +ignore_termtitle = True -def _dummy(*args,**kw): +def set_term_title(*args,**kw): + """Dummy no-op.""" pass - -set_term_title = _dummy - diff --git a/IPython/platutils_posix.py b/IPython/platutils_posix.py index fa46ce8..d0dbc0a 100644 --- a/IPython/platutils_posix.py +++ b/IPython/platutils_posix.py @@ -3,12 +3,8 @@ Importing this module directly is not portable - rather, import platutils to use these functions in platform agnostic fashion. - -$Id: ipstruct.py 1005 2006-01-12 08:39:26Z fperez $ - """ - #***************************************************************************** # Copyright (C) 2001-2006 Fernando Perez # @@ -31,9 +27,6 @@ def _dummy_op(*a, **b): def _set_term_title_xterm(title): """ Change virtual terminal title in xterm-workalikes """ - if ignore_termtitle: - return - sys.stdout.write('\033]%d;%s\007' % (0,title)) @@ -41,7 +34,3 @@ if os.environ.get('TERM','') == 'xterm': set_term_title = _set_term_title_xterm else: set_term_title = _dummy_op - -def freeze_term_title(): - global ignore_termtitle - ignore_termtitle = True diff --git a/IPython/platutils_win32.py b/IPython/platutils_win32.py index 76e5333..630a9ca 100644 --- a/IPython/platutils_win32.py +++ b/IPython/platutils_win32.py @@ -3,12 +3,8 @@ Importing this module directly is not portable - rather, import platutils to use these functions in platform agnostic fashion. - -$Id: ipstruct.py 1005 2006-01-12 08:39:26Z fperez $ - """ - #***************************************************************************** # Copyright (C) 2001-2006 Fernando Perez # @@ -22,35 +18,30 @@ __license__ = Release.license import os -ignore_termtitle = 0 +ignore_termtitle = False try: import ctypes - SetConsoleTitleW=ctypes.windll.kernel32.SetConsoleTitleW - SetConsoleTitleW.argtypes=[ctypes.c_wchar_p] - def _set_term_title(title): - """ Set terminal title using the ctypes""" + + SetConsoleTitleW = ctypes.windll.kernel32.SetConsoleTitleW + SetConsoleTitleW.argtypes = [ctypes.c_wchar_p] + + def set_term_title(title): + """Set terminal title using ctypes to access the Win32 APIs.""" SetConsoleTitleW(title) except ImportError: - def _set_term_title(title): - """ Set terminal title using the 'title' command """ - curr=os.getcwd() - os.chdir("C:") #Cannot be on network share when issuing system commands - ret = os.system("title " + title) - os.chdir(curr) + def set_term_title(title): + """Set terminal title using the 'title' command.""" + global ignore_termtitle + + try: + # Cannot be on network share when issuing system commands + curr = os.getcwd() + os.chdir("C:") + ret = os.system("title " + title) + finally: + os.chdir(curr) if ret: - ignore_termtitle = 1 - -def set_term_title(title): - """ Set terminal title using the 'title' command """ - global ignore_termtitle - - if ignore_termtitle: - return - _set_term_title(title) - -def freeze_term_title(): - global ignore_termtitle - ignore_termtitle = 1 - + # non-zero return code signals error, don't try again + ignore_termtitle = True diff --git a/IPython/testing/ipdoctest.py b/IPython/testing/attic/ipdoctest.py similarity index 100% rename from IPython/testing/ipdoctest.py rename to IPython/testing/attic/ipdoctest.py diff --git a/IPython/testing/parametric.py b/IPython/testing/attic/parametric.py similarity index 100% rename from IPython/testing/parametric.py rename to IPython/testing/attic/parametric.py diff --git a/IPython/testing/tcommon.py b/IPython/testing/attic/tcommon.py similarity index 100% rename from IPython/testing/tcommon.py rename to IPython/testing/attic/tcommon.py diff --git a/IPython/testing/testTEMPLATE.py b/IPython/testing/attic/testTEMPLATE.py similarity index 100% rename from IPython/testing/testTEMPLATE.py rename to IPython/testing/attic/testTEMPLATE.py diff --git a/IPython/testing/tstTEMPLATE_doctest.py b/IPython/testing/attic/tstTEMPLATE_doctest.py similarity index 100% rename from IPython/testing/tstTEMPLATE_doctest.py rename to IPython/testing/attic/tstTEMPLATE_doctest.py diff --git a/IPython/testing/tstTEMPLATE_doctest.txt b/IPython/testing/attic/tstTEMPLATE_doctest.txt similarity index 100% rename from IPython/testing/tstTEMPLATE_doctest.txt rename to IPython/testing/attic/tstTEMPLATE_doctest.txt diff --git a/IPython/testing/plugin/Makefile b/IPython/testing/plugin/Makefile new file mode 100644 index 0000000..62417a6 --- /dev/null +++ b/IPython/testing/plugin/Makefile @@ -0,0 +1,20 @@ +# Set this prefix to where you want to install the plugin +PREFIX=~/usr/local +PREFIX=~/tmp/local + +plugin: IPython_doctest_plugin.egg-info + +test: plugin dtexample.py + nosetests -s --with-ipdoctest --doctest-tests --doctest-extension=txt \ + dtexample.py test*.txt + +deb: plugin dtexample.py + nosetests -vs --with-ipdoctest --doctest-tests --doctest-extension=txt \ + test_combo.txt + +IPython_doctest_plugin.egg-info: ipdoctest.py setup.py + python setup.py install --prefix=$(PREFIX) + touch $@ + +clean: + rm -rf IPython_doctest_plugin.egg-info *~ *pyc build/ dist/ diff --git a/IPython/testing/plugin/README.txt b/IPython/testing/plugin/README.txt new file mode 100644 index 0000000..6b34f9e --- /dev/null +++ b/IPython/testing/plugin/README.txt @@ -0,0 +1,39 @@ +======================================================= + Nose plugin with IPython and extension module support +======================================================= + +This directory provides the key functionality for test support that IPython +needs as a nose plugin, which can be installed for use in projects other than +IPython. + +The presence of a Makefile here is mostly for development and debugging +purposes as it only provides a few shorthand commands. You can manually +install the plugin by using standard Python procedures (``setup.py install`` +with appropriate arguments). + +To install the plugin using the Makefile, edit its first line to reflect where +you'd like the installation. If you want it system-wide, you may want to edit +the install line in the plugin target to use sudo and no prefix:: + + sudo python setup.py install + +instead of the code using `--prefix` that's in there. + +Once you've set the prefix, simply build/install the plugin with:: + + make + +and run the tests with:: + + make test + +You should see output similar to:: + + maqroll[plugin]> make test + nosetests -s --with-ipdoctest --doctest-tests dtexample.py + .. + ---------------------------------------------------------------------- + Ran 2 tests in 0.016s + + OK + diff --git a/IPython/testing/plugin/dtexample.py b/IPython/testing/plugin/dtexample.py new file mode 100644 index 0000000..d4b6d01 --- /dev/null +++ b/IPython/testing/plugin/dtexample.py @@ -0,0 +1,72 @@ +"""Simple example using doctests. + +This file just contains doctests both using plain python and IPython prompts. +All tests should be loaded by nose. +""" + +def pyfunc(): + """Some pure python tests... + + >>> pyfunc() + 'pyfunc' + + >>> import os + + >>> 2+3 + 5 + + >>> for i in range(3): + ... print i, + ... print i+1, + ... + 0 1 1 2 2 3 + """ + + return 'pyfunc' + +def ipfunc(): + """Some ipython tests... + + In [1]: import os + + In [2]: cd / + / + + In [3]: 2+3 + Out[3]: 5 + + In [26]: for i in range(3): + ....: print i, + ....: print i+1, + ....: + 0 1 1 2 2 3 + + + Examples that access the operating system work: + + In [1]: !echo hello + hello + + In [2]: !echo hello > /tmp/foo + + In [3]: !cat /tmp/foo + hello + + In [4]: rm -f /tmp/foo + + It's OK to use '_' for the last result, but do NOT try to use IPython's + numbered history of _NN outputs, since those won't exist under the + doctest environment: + + In [7]: 3+4 + Out[7]: 7 + + In [8]: _+3 + Out[8]: 10 + + In [9]: ipfunc() + Out[9]: 'ipfunc' + """ + + return 'ipfunc' + diff --git a/IPython/testing/plugin/ipdoctest.py b/IPython/testing/plugin/ipdoctest.py new file mode 100644 index 0000000..e360415 --- /dev/null +++ b/IPython/testing/plugin/ipdoctest.py @@ -0,0 +1,587 @@ +"""Nose Plugin that supports IPython doctests. + +Limitations: + +- When generating examples for use as doctests, make sure that you have + pretty-printing OFF. This can be done either by starting ipython with the + flag '--nopprint', by setting pprint to 0 in your ipythonrc file, or by + interactively disabling it with %Pprint. This is required so that IPython + output matches that of normal Python, which is used by doctest for internal + execution. + +- Do not rely on specific prompt numbers for results (such as using + '_34==True', for example). For IPython tests run via an external process the + prompt numbers may be different, and IPython tests run as normal python code + won't even have these special _NN variables set at all. + +- IPython functions that produce output as a side-effect of calling a system + process (e.g. 'ls') can be doc-tested, but they must be handled in an + external IPython process. Such doctests must be tagged with: + + # ipdoctest: EXTERNAL + + so that the testing machinery handles them differently. Since these are run + via pexpect in an external process, they can't deal with exceptions or other + fancy featurs of regular doctests. You must limit such tests to simple + matching of the output. For this reason, I recommend you limit these kinds + of doctests to features that truly require a separate process, and use the + normal IPython ones (which have all the features of normal doctests) for + everything else. See the examples at the bottom of this file for a + comparison of what can be done with both types. +""" + + +#----------------------------------------------------------------------------- +# Module imports + +# From the standard library +import __builtin__ +import commands +import doctest +import inspect +import logging +import os +import re +import sys +import unittest + +from inspect import getmodule + +# Third-party modules +import nose.core + +from nose.plugins import doctests, Plugin +from nose.util import anyp, getpackage, test_address, resolve_name, tolist + +# Our own imports +#from extdoctest import ExtensionDoctest, DocTestFinder +#from dttools import DocTestFinder, DocTestCase +#----------------------------------------------------------------------------- +# Module globals and other constants + +log = logging.getLogger(__name__) + +########################################################################### +# *** HACK *** +# We must start our own ipython object and heavily muck with it so that all the +# modifications IPython makes to system behavior don't send the doctest +# machinery into a fit. This code should be considered a gross hack, but it +# gets the job done. + +def start_ipython(): + """Start a global IPython shell, which we need for IPython-specific syntax. + """ + import IPython + + def xsys(cmd): + """Execute a command and print its output. + + This is just a convenience function to replace the IPython system call + with one that is more doctest-friendly. + """ + cmd = _ip.IP.var_expand(cmd,depth=1) + sys.stdout.write(commands.getoutput(cmd)) + sys.stdout.flush() + + # Store certain global objects that IPython modifies + _displayhook = sys.displayhook + _excepthook = sys.excepthook + _main = sys.modules.get('__main__') + + # Start IPython instance + IPython.Shell.IPShell(['--classic','--noterm_title']) + + # Deactivate the various python system hooks added by ipython for + # interactive convenience so we don't confuse the doctest system + sys.modules['__main__'] = _main + sys.displayhook = _displayhook + sys.excepthook = _excepthook + + # So that ipython magics and aliases can be doctested (they work by making + # a call into a global _ip object) + _ip = IPython.ipapi.get() + __builtin__._ip = _ip + + # Modify the IPython system call with one that uses getoutput, so that we + # can capture subcommands and print them to Python's stdout, otherwise the + # doctest machinery would miss them. + _ip.system = xsys + +# The start call MUST be made here. I'm not sure yet why it doesn't work if +# it is made later, at plugin initialization time, but in all my tests, that's +# the case. +start_ipython() + +# *** END HACK *** +########################################################################### + +#----------------------------------------------------------------------------- +# Modified version of the one in the stdlib, that fixes a python bug (doctests +# not found in extension modules, http://bugs.python.org/issue3158) +class DocTestFinder(doctest.DocTestFinder): + + def _from_module(self, module, object): + """ + Return true if the given object is defined in the given + module. + """ + if module is None: + #print '_fm C1' # dbg + return True + elif inspect.isfunction(object): + #print '_fm C2' # dbg + return module.__dict__ is object.func_globals + elif inspect.isbuiltin(object): + #print '_fm C2-1' # dbg + return module.__name__ == object.__module__ + elif inspect.isclass(object): + #print '_fm C3' # dbg + return module.__name__ == object.__module__ + elif inspect.ismethod(object): + # This one may be a bug in cython that fails to correctly set the + # __module__ attribute of methods, but since the same error is easy + # to make by extension code writers, having this safety in place + # isn't such a bad idea + #print '_fm C3-1' # dbg + return module.__name__ == object.im_class.__module__ + elif inspect.getmodule(object) is not None: + #print '_fm C4' # dbg + #print 'C4 mod',module,'obj',object # dbg + return module is inspect.getmodule(object) + elif hasattr(object, '__module__'): + #print '_fm C5' # dbg + return module.__name__ == object.__module__ + elif isinstance(object, property): + #print '_fm C6' # dbg + return True # [XX] no way not be sure. + else: + raise ValueError("object must be a class or function") + + + + def _find(self, tests, obj, name, module, source_lines, globs, seen): + """ + Find tests for the given object and any contained objects, and + add them to `tests`. + """ + + doctest.DocTestFinder._find(self,tests, obj, name, module, + source_lines, globs, seen) + + # Below we re-run pieces of the above method with manual modifications, + # because the original code is buggy and fails to correctly identify + # doctests in extension modules. + + # Local shorthands + from inspect import isroutine, isclass, ismodule + + # Look for tests in a module's contained objects. + if inspect.ismodule(obj) and self._recurse: + for valname, val in obj.__dict__.items(): + valname1 = '%s.%s' % (name, valname) + if ( (isroutine(val) or isclass(val)) + and self._from_module(module, val) ): + + self._find(tests, val, valname1, module, source_lines, + globs, seen) + + + # Look for tests in a class's contained objects. + if inspect.isclass(obj) and self._recurse: + #print 'RECURSE into class:',obj # dbg + for valname, val in obj.__dict__.items(): + #valname1 = '%s.%s' % (name, valname) # dbg + #print 'N',name,'VN:',valname,'val:',str(val)[:77] # dbg + # Special handling for staticmethod/classmethod. + if isinstance(val, staticmethod): + val = getattr(obj, valname) + if isinstance(val, classmethod): + val = getattr(obj, valname).im_func + + # Recurse to methods, properties, and nested classes. + if ((inspect.isfunction(val) or inspect.isclass(val) or + inspect.ismethod(val) or + isinstance(val, property)) and + self._from_module(module, val)): + valname = '%s.%s' % (name, valname) + self._find(tests, val, valname, module, source_lines, + globs, seen) + + +class DocTestCase(doctests.DocTestCase): + """Proxy for DocTestCase: provides an address() method that + returns the correct address for the doctest case. Otherwise + acts as a proxy to the test case. To provide hints for address(), + an obj may also be passed -- this will be used as the test object + for purposes of determining the test address, if it is provided. + """ + + # doctests loaded via find(obj) omit the module name + # so we need to override id, __repr__ and shortDescription + # bonus: this will squash a 2.3 vs 2.4 incompatiblity + def id(self): + name = self._dt_test.name + filename = self._dt_test.filename + if filename is not None: + pk = getpackage(filename) + if pk is not None and not name.startswith(pk): + name = "%s.%s" % (pk, name) + return name + + +# Classes and functions + +def is_extension_module(filename): + """Return whether the given filename is an extension module. + + This simply checks that the extension is either .so or .pyd. + """ + return os.path.splitext(filename)[1].lower() in ('.so','.pyd') + + +# A simple subclassing of the original with a different class name, so we can +# distinguish and treat differently IPython examples from pure python ones. +class IPExample(doctest.Example): pass + +class IPExternalExample(doctest.Example): + """Doctest examples to be run in an external process.""" + + def __init__(self, source, want, exc_msg=None, lineno=0, indent=0, + options=None): + # Parent constructor + doctest.Example.__init__(self,source,want,exc_msg,lineno,indent,options) + + # An EXTRA newline is needed to prevent pexpect hangs + self.source += '\n' + +class IPDocTestParser(doctest.DocTestParser): + """ + A class used to parse strings containing doctest examples. + + Note: This is a version modified to properly recognize IPython input and + convert any IPython examples into valid Python ones. + """ + # This regular expression is used to find doctest examples in a + # string. It defines three groups: `source` is the source code + # (including leading indentation and prompts); `indent` is the + # indentation of the first (PS1) line of the source code; and + # `want` is the expected output (including leading indentation). + + # Classic Python prompts or default IPython ones + _PS1_PY = r'>>>' + _PS2_PY = r'\.\.\.' + + _PS1_IP = r'In\ \[\d+\]:' + _PS2_IP = r'\ \ \ \.\.\.+:' + + _RE_TPL = r''' + # Source consists of a PS1 line followed by zero or more PS2 lines. + (?P + (?:^(?P [ ]*) (?P %s) .*) # PS1 line + (?:\n [ ]* (?P %s) .*)*) # PS2 lines + \n? # a newline + # Want consists of any non-blank lines that do not start with PS1. + (?P (?:(?![ ]*$) # Not a blank line + (?![ ]*%s) # Not a line starting with PS1 + (?![ ]*%s) # Not a line starting with PS2 + .*$\n? # But any other line + )*) + ''' + + _EXAMPLE_RE_PY = re.compile( _RE_TPL % (_PS1_PY,_PS2_PY,_PS1_PY,_PS2_PY), + re.MULTILINE | re.VERBOSE) + + _EXAMPLE_RE_IP = re.compile( _RE_TPL % (_PS1_IP,_PS2_IP,_PS1_IP,_PS2_IP), + re.MULTILINE | re.VERBOSE) + + def ip2py(self,source): + """Convert input IPython source into valid Python.""" + out = [] + newline = out.append + for line in source.splitlines(): + #newline(_ip.IPipython.prefilter(line,True)) + newline(_ip.IP.prefilter(line,True)) + newline('') # ensure a closing newline, needed by doctest + return '\n'.join(out) + + def parse(self, string, name=''): + """ + Divide the given string into examples and intervening text, + and return them as a list of alternating Examples and strings. + Line numbers for the Examples are 0-based. The optional + argument `name` is a name identifying this string, and is only + used for error messages. + """ + + #print 'Parse string:\n',string # dbg + + string = string.expandtabs() + # If all lines begin with the same indentation, then strip it. + min_indent = self._min_indent(string) + if min_indent > 0: + string = '\n'.join([l[min_indent:] for l in string.split('\n')]) + + output = [] + charno, lineno = 0, 0 + + # Whether to convert the input from ipython to python syntax + ip2py = False + # Find all doctest examples in the string. First, try them as Python + # examples, then as IPython ones + terms = list(self._EXAMPLE_RE_PY.finditer(string)) + if terms: + # Normal Python example + #print '-'*70 # dbg + #print 'PyExample, Source:\n',string # dbg + #print '-'*70 # dbg + Example = doctest.Example + else: + # It's an ipython example. Note that IPExamples are run + # in-process, so their syntax must be turned into valid python. + # IPExternalExamples are run out-of-process (via pexpect) so they + # don't need any filtering (a real ipython will be executing them). + terms = list(self._EXAMPLE_RE_IP.finditer(string)) + if re.search(r'#\s*ipdoctest:\s*EXTERNAL',string): + #print '-'*70 # dbg + #print 'IPExternalExample, Source:\n',string # dbg + #print '-'*70 # dbg + Example = IPExternalExample + else: + #print '-'*70 # dbg + #print 'IPExample, Source:\n',string # dbg + #print '-'*70 # dbg + Example = IPExample + ip2py = True + + for m in terms: + # Add the pre-example text to `output`. + output.append(string[charno:m.start()]) + # Update lineno (lines before this example) + lineno += string.count('\n', charno, m.start()) + # Extract info from the regexp match. + (source, options, want, exc_msg) = \ + self._parse_example(m, name, lineno,ip2py) + if Example is IPExternalExample: + options[doctest.NORMALIZE_WHITESPACE] = True + want += '\n' + # Create an Example, and add it to the list. + if not self._IS_BLANK_OR_COMMENT(source): + #print 'Example source:', source # dbg + output.append(Example(source, want, exc_msg, + lineno=lineno, + indent=min_indent+len(m.group('indent')), + options=options)) + # Update lineno (lines inside this example) + lineno += string.count('\n', m.start(), m.end()) + # Update charno. + charno = m.end() + # Add any remaining post-example text to `output`. + output.append(string[charno:]) + + return output + + def _parse_example(self, m, name, lineno,ip2py=False): + """ + Given a regular expression match from `_EXAMPLE_RE` (`m`), + return a pair `(source, want)`, where `source` is the matched + example's source code (with prompts and indentation stripped); + and `want` is the example's expected output (with indentation + stripped). + + `name` is the string's name, and `lineno` is the line number + where the example starts; both are used for error messages. + + Optional: + `ip2py`: if true, filter the input via IPython to convert the syntax + into valid python. + """ + + # Get the example's indentation level. + indent = len(m.group('indent')) + + # Divide source into lines; check that they're properly + # indented; and then strip their indentation & prompts. + source_lines = m.group('source').split('\n') + + # We're using variable-length input prompts + ps1 = m.group('ps1') + ps2 = m.group('ps2') + ps1_len = len(ps1) + + self._check_prompt_blank(source_lines, indent, name, lineno,ps1_len) + if ps2: + self._check_prefix(source_lines[1:], ' '*indent + ps2, name, lineno) + + source = '\n'.join([sl[indent+ps1_len+1:] for sl in source_lines]) + + if ip2py: + # Convert source input from IPython into valid Python syntax + source = self.ip2py(source) + + # Divide want into lines; check that it's properly indented; and + # then strip the indentation. Spaces before the last newline should + # be preserved, so plain rstrip() isn't good enough. + want = m.group('want') + want_lines = want.split('\n') + if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]): + del want_lines[-1] # forget final newline & spaces after it + self._check_prefix(want_lines, ' '*indent, name, + lineno + len(source_lines)) + + # Remove ipython output prompt that might be present in the first line + want_lines[0] = re.sub(r'Out\[\d+\]: \s*?\n?','',want_lines[0]) + + want = '\n'.join([wl[indent:] for wl in want_lines]) + + # If `want` contains a traceback message, then extract it. + m = self._EXCEPTION_RE.match(want) + if m: + exc_msg = m.group('msg') + else: + exc_msg = None + + # Extract options from the source. + options = self._find_options(source, name, lineno) + + return source, options, want, exc_msg + + def _check_prompt_blank(self, lines, indent, name, lineno, ps1_len): + """ + Given the lines of a source string (including prompts and + leading indentation), check to make sure that every prompt is + followed by a space character. If any line is not followed by + a space character, then raise ValueError. + + Note: IPython-modified version which takes the input prompt length as a + parameter, so that prompts of variable length can be dealt with. + """ + space_idx = indent+ps1_len + min_len = space_idx+1 + for i, line in enumerate(lines): + if len(line) >= min_len and line[space_idx] != ' ': + raise ValueError('line %r of the docstring for %s ' + 'lacks blank after %s: %r' % + (lineno+i+1, name, + line[indent:space_idx], line)) + +SKIP = doctest.register_optionflag('SKIP') + +########################################################################### + +class DocFileCase(doctest.DocFileCase): + """Overrides to provide filename + """ + def address(self): + return (self._dt_test.filename, None, None) + + +class ExtensionDoctest(doctests.Doctest): + """Nose Plugin that supports doctests in extension modules. + """ + name = 'extdoctest' # call nosetests with --with-extdoctest + enabled = True + + def options(self, parser, env=os.environ): + Plugin.options(self, parser, env) + + def configure(self, options, config): + Plugin.configure(self, options, config) + self.doctest_tests = options.doctest_tests + self.extension = tolist(options.doctestExtension) + self.finder = DocTestFinder() + self.parser = doctest.DocTestParser() + + + def loadTestsFromExtensionModule(self,filename): + bpath,mod = os.path.split(filename) + modname = os.path.splitext(mod)[0] + try: + sys.path.append(bpath) + module = __import__(modname) + tests = list(self.loadTestsFromModule(module)) + finally: + sys.path.pop() + return tests + + def loadTestsFromFile(self, filename): + if is_extension_module(filename): + for t in self.loadTestsFromExtensionModule(filename): + yield t + else: + ## for t in list(doctests.Doctest.loadTestsFromFile(self,filename)): + ## yield t + pass + + if self.extension and anyp(filename.endswith, self.extension): + #print 'lTF',filename # dbg + name = os.path.basename(filename) + dh = open(filename) + try: + doc = dh.read() + finally: + dh.close() + test = self.parser.get_doctest( + doc, globs={'__file__': filename}, name=name, + filename=filename, lineno=0) + if test.examples: + #print 'FileCase:',test.examples # dbg + yield DocFileCase(test) + else: + yield False # no tests to load + + + def wantFile(self,filename): + """Return whether the given filename should be scanned for tests. + + Modified version that accepts extension modules as valid containers for + doctests. + """ + #print 'Filename:',filename # dbg + + if is_extension_module(filename): + return True + else: + return doctests.Doctest.wantFile(self,filename) + + # NOTE: the method below is a *copy* of the one in the nose doctests + # plugin, but we have to replicate it here in order to have it resolve the + # DocTestCase (last line) to our local copy, since the nose plugin doesn't + # provide a public hook for what TestCase class to use. The alternative + # would be to monkeypatch doctest in the stdlib, but that's ugly and + # brittle, since a change in plugin load order can break it. So for now, + # we just paste this in here, inelegant as this may be. + + def loadTestsFromModule(self, module): + #print 'lTM',module # dbg + + if not self.matches(module.__name__): + log.debug("Doctest doesn't want module %s", module) + return + tests = self.finder.find(module) + if not tests: + return + tests.sort() + module_file = module.__file__ + if module_file[-4:] in ('.pyc', '.pyo'): + module_file = module_file[:-1] + for test in tests: + if not test.examples: + continue + if not test.filename: + test.filename = module_file + yield DocTestCase(test) + +class IPythonDoctest(ExtensionDoctest): + """Nose Plugin that supports doctests in extension modules. + """ + name = 'ipdoctest' # call nosetests with --with-ipdoctest + enabled = True + + def configure(self, options, config): + + Plugin.configure(self, options, config) + self.doctest_tests = options.doctest_tests + self.extension = tolist(options.doctestExtension) + self.parser = IPDocTestParser() + #self.finder = DocTestFinder(parser=IPDocTestParser()) + self.finder = DocTestFinder(parser=self.parser) diff --git a/IPython/testing/plugin/iptest.py b/IPython/testing/plugin/iptest.py new file mode 100755 index 0000000..390c422 --- /dev/null +++ b/IPython/testing/plugin/iptest.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +"""Nose-based test runner. +""" + +from nose.core import main +from nose.plugins.builtin import plugins +from nose.plugins.doctests import Doctest + +import ipdoctest +from ipdoctest import IPDocTestRunner + +if __name__ == '__main__': + print 'WARNING: this code is incomplete!' + print + + pp = [x() for x in plugins] # activate all builtin plugins first + main(testRunner=IPDocTestRunner(), + plugins=pp+[ipdoctest.IPythonDoctest(),Doctest()]) diff --git a/IPython/testing/plugin/setup.py b/IPython/testing/plugin/setup.py new file mode 100755 index 0000000..a3281d3 --- /dev/null +++ b/IPython/testing/plugin/setup.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +"""A Nose plugin to support IPython doctests. +""" + +from setuptools import setup + +setup(name='IPython doctest plugin', + version='0.1', + author='The IPython Team', + description = 'Nose plugin to load IPython-extended doctests', + license = 'LGPL', + py_modules = ['ipdoctest'], + entry_points = { + 'nose.plugins.0.10': ['ipdoctest = ipdoctest:IPythonDoctest', + 'extdoctest = ipdoctest:ExtensionDoctest', + ], + }, + ) diff --git a/IPython/testing/plugin/test_combo.txt b/IPython/testing/plugin/test_combo.txt new file mode 100644 index 0000000..6c8759f --- /dev/null +++ b/IPython/testing/plugin/test_combo.txt @@ -0,0 +1,36 @@ +======================= + Combo testing example +======================= + +This is a simple example that mixes ipython doctests:: + + In [1]: import code + + In [2]: 2**12 + Out[2]: 4096 + +with command-line example information that does *not* get executed:: + + $ mpirun -n 4 ipengine --controller-port=10000 --controller-ip=host0 + +and with literal examples of Python source code:: + + controller = dict(host='myhost', + engine_port=None, # default is 10105 + control_port=None, + ) + + # keys are hostnames, values are the number of engine on that host + engines = dict(node1=2, + node2=2, + node3=2, + node3=2, + ) + + # Force failure to detect that this test is being run. + 1/0 + +These source code examples are executed but no output is compared at all. An +error or failure is reported only if an exception is raised. + +NOTE: the execution of pure python blocks is not yet working! diff --git a/IPython/testing/plugin/test_example.txt b/IPython/testing/plugin/test_example.txt new file mode 100644 index 0000000..d8bc6fd --- /dev/null +++ b/IPython/testing/plugin/test_example.txt @@ -0,0 +1,24 @@ +===================================== + Tests in example form - pure python +===================================== + +This file contains doctest examples embedded as code blocks, using normal +Python prompts. See the accompanying file for similar examples using IPython +prompts (you can't mix both types within one file). The following will be run +as a test:: + + >>> 1+1 + 2 + >>> print "hello" + hello + +More than one example works:: + + >>> s="Hello World" + + >>> s.upper() + 'HELLO WORLD' + +but you should note that the *entire* test file is considered to be a single +test. Individual code blocks that fail are printed separately as ``example +failures``, but the whole file is still counted and reported as one test. diff --git a/IPython/testing/plugin/test_exampleip.txt b/IPython/testing/plugin/test_exampleip.txt new file mode 100644 index 0000000..8afcbfd --- /dev/null +++ b/IPython/testing/plugin/test_exampleip.txt @@ -0,0 +1,30 @@ +================================= + Tests in example form - IPython +================================= + +You can write text files with examples that use IPython prompts (as long as you +use the nose ipython doctest plugin), but you can not mix and match prompt +styles in a single file. That is, you either use all ``>>>`` prompts or all +IPython-style prompts. Your test suite *can* have both types, you just need to +put each type of example in a separate. Using IPython prompts, you can paste +directly from your session:: + + In [5]: s="Hello World" + + In [6]: s.upper() + Out[6]: 'HELLO WORLD' + +Another example:: + + In [8]: 1+3 + Out[8]: 4 + +Just like in IPython docstrings, you can use all IPython syntax and features:: + + In [9]: !echo "hello" + hello + + In [10]: a='hi' + + In [11]: !echo $a + hi diff --git a/IPython/testing/tutils.py b/IPython/testing/tutils.py index 6bb14b4..6a24639 100644 --- a/IPython/testing/tutils.py +++ b/IPython/testing/tutils.py @@ -1,6 +1,20 @@ -"""Utilities for testing code. +"""DEPRECATED - use IPython.testing.util instead. + +Utilities for testing code. """ +############################################################################# + +# This was old testing code we never really used in IPython. The pieces of +# testing machinery from snakeoil that were good have already been merged into +# the nose plugin, so this can be taken away soon. Leave a warning for now, +# we'll remove it in a later release (around 0.10 or so). +from warnings import warn +warn('This will be removed soon. Use IPython.testing.util instead', + DeprecationWarning) + +############################################################################# + # Required modules and packages # Standard Python lib @@ -36,7 +50,7 @@ def test_path(path): This finds the correct path of the test package on disk, and prepends it to the input path.""" - + return os.path.join(TEST_PATH,path) def fullPath(startPath,files): @@ -55,7 +69,7 @@ def fullPath(startPath,files): One or more files. :Examples: - + >>> fullPath('/foo/bar.py',['a.txt','b.txt']) ['/foo/a.txt', '/foo/b.txt'] @@ -66,7 +80,7 @@ def fullPath(startPath,files): >>> fullPath('/foo','a.txt') ['/a.txt'] """ - + files = utils.list_strings(files) base = os.path.split(startPath)[0] return [ os.path.join(base,f) for f in files ] diff --git a/IPython/tools/tests/__init__.py b/IPython/tools/tests/__init__.py deleted file mode 100644 index f751f68..0000000 --- a/IPython/tools/tests/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# encoding: utf-8 -__docformat__ = "restructuredtext en" -#------------------------------------------------------------------------------- -# Copyright (C) 2005 Fernando Perez -# Brian E Granger -# Benjamin Ragan-Kelley -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#------------------------------------------------------------------------------- diff --git a/IPython/tools/tests/test_tools_utils.py b/IPython/tools/tests/test_tools_utils.py deleted file mode 100755 index 61ec558..0000000 --- a/IPython/tools/tests/test_tools_utils.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -"""Testing script for the tools.utils module. -""" - -# Module imports -from IPython.testing import tcommon -from IPython.testing.tcommon import * - -# If you have standalone doctests in a separate file, set their names in the -# dt_files variable (as a single string or a list thereof). The mkPath call -# forms an absolute path based on the current file, it is not needed if you -# provide the full pahts. -dt_files = fullPath(__file__,['tst_tools_utils_doctest.txt', - 'tst_tools_utils_doctest2.txt']) - -# If you have any modules whose docstrings should be scanned for embedded tests -# as examples accorging to standard doctest practice, set them here (as a -# single string or a list thereof): -dt_modules = 'IPython.tools.utils' - -########################################################################## -### Regular unittest test classes go here - -## class utilsTestCase(unittest.TestCase): -## def test_foo(self): -## pass - -########################################################################## -### Main -# This ensures that the code will run either standalone as a script, or that it -# can be picked up by Twisted's `trial` test wrapper to run all the tests. -if tcommon.pexpect is not None: - if __name__ == '__main__': - unittest.main(testLoader=IPDocTestLoader(dt_files,dt_modules)) - else: - testSuite = lambda : makeTestSuite(__name__,dt_files,dt_modules) diff --git a/IPython/tools/tests/tst_tools_utils_doctest2.txt b/IPython/tools/tests/test_tools_utils.txt similarity index 57% rename from IPython/tools/tests/tst_tools_utils_doctest2.txt rename to IPython/tools/tests/test_tools_utils.txt index 1ccea08..60235bc 100644 --- a/IPython/tools/tests/tst_tools_utils_doctest2.txt +++ b/IPython/tools/tests/test_tools_utils.txt @@ -3,40 +3,15 @@ ========================================= The way doctest loads these, the entire document is applied as a single test -rather than multiple individual ones, unfortunately. +rather than multiple individual ones, unfortunately:: - -Auto-generated tests -==================== - - ----------------------------------------------------------------------------- - -Begin included file tst_tools_utils_doctest2.py:: - - # Setup - all imports are done in tcommon - >>> from IPython.testing import tcommon - >>> from IPython.testing.tcommon import * - - # Doctest code begins here >>> from IPython.tools import utils - + # Some other tests for utils - + >>> utils.marquee('Testing marquee') '****************************** Testing marquee ******************************' - + >>> utils.marquee('Another test',30,'.') '........ Another test ........' - - -End included file tst_tools_utils_doctest2.py - ----------------------------------------------------------------------------- - - - -Manually generated tests -======================== -These are one-off tests written by hand, copied from an interactive prompt. diff --git a/IPython/tools/tests/tst_tools_utils_doctest.py b/IPython/tools/tests/tst_tools_utils_doctest.py deleted file mode 100644 index bb0abe5..0000000 --- a/IPython/tools/tests/tst_tools_utils_doctest.py +++ /dev/null @@ -1,12 +0,0 @@ -# Setup - all imports are done in tcommon -from IPython.testing import tcommon -from IPython.testing.tcommon import * - -# Doctest code begins here -from IPython.tools import utils - -for i in range(10): - print i, - print i+1 - -print 'simple loop is over' diff --git a/IPython/tools/tests/tst_tools_utils_doctest.tpl.txt b/IPython/tools/tests/tst_tools_utils_doctest.tpl.txt deleted file mode 100644 index 929d9c2..0000000 --- a/IPython/tools/tests/tst_tools_utils_doctest.tpl.txt +++ /dev/null @@ -1,18 +0,0 @@ -========================================= - Doctests for the ``tools.utils`` module -========================================= - -The way doctest loads these, the entire document is applied as a single test -rather than multiple individual ones, unfortunately. - - -Auto-generated tests -==================== - -%run tst_tools_utils_doctest.py - - -Manually generated tests -======================== - -These are one-off tests written by hand, copied from an interactive prompt. diff --git a/IPython/tools/tests/tst_tools_utils_doctest.txt b/IPython/tools/tests/tst_tools_utils_doctest.txt deleted file mode 100644 index 8873850..0000000 --- a/IPython/tools/tests/tst_tools_utils_doctest.txt +++ /dev/null @@ -1,42 +0,0 @@ - -========================= - Auto-generated doctests -========================= - -This file was auto-generated by IPython in its entirety. If you need finer -control over the contents, simply make a manual template. See the -mkdoctests.py script for details. - - ----------------------------------------------------------------------------- - -Begin included file tst_tools_utils_doctest.py:: - - # Setup - all imports are done in tcommon - >>> from IPython.testing import tcommon - >>> from IPython.testing.tcommon import * - - # Doctest code begins here - >>> from IPython.tools import utils - - >>> for i in range(10): - ... print i, - ... print i+1 - ... - 0 1 - 1 2 - 2 3 - 3 4 - 4 5 - 5 6 - 6 7 - 7 8 - 8 9 - 9 10 - >>> print 'simple loop is over' - simple loop is over - -End included file tst_tools_utils_doctest.py - ----------------------------------------------------------------------------- - diff --git a/IPython/tools/tests/tst_tools_utils_doctest2.py b/IPython/tools/tests/tst_tools_utils_doctest2.py deleted file mode 100644 index 4e6f3b2..0000000 --- a/IPython/tools/tests/tst_tools_utils_doctest2.py +++ /dev/null @@ -1,13 +0,0 @@ -# Setup - all imports are done in tcommon -from IPython.testing import tcommon -from IPython.testing.tcommon import * - -# Doctest code begins here -from IPython.tools import utils - -# Some other tests for utils - -utils.marquee('Testing marquee') - -utils.marquee('Another test',30,'.') - diff --git a/IPython/tools/tests/tst_tools_utils_doctest2.tpl.txt b/IPython/tools/tests/tst_tools_utils_doctest2.tpl.txt deleted file mode 100644 index d09f4c4..0000000 --- a/IPython/tools/tests/tst_tools_utils_doctest2.tpl.txt +++ /dev/null @@ -1,18 +0,0 @@ -========================================= - Doctests for the ``tools.utils`` module -========================================= - -The way doctest loads these, the entire document is applied as a single test -rather than multiple individual ones, unfortunately. - - -Auto-generated tests -==================== - -%run tst_tools_utils_doctest2.py - - -Manually generated tests -======================== - -These are one-off tests written by hand, copied from an interactive prompt. diff --git a/MANIFEST.in b/MANIFEST.in index 7fa5a4a..227736e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -16,7 +16,6 @@ graft IPython/tools graft docs exclude docs/\#* exclude docs/man/*.1 -exclude docs/ChangeLog.* # There seems to be no way of excluding whole subdirectories, other than # manually excluding all their subdirs. distutils really is horrible... diff --git a/docs/emacs/ipython.el b/docs/emacs/ipython.el index ff32bbe..273d7d0 100644 --- a/docs/emacs/ipython.el +++ b/docs/emacs/ipython.el @@ -9,7 +9,7 @@ (defconst ipython-version "$Revision: 2927 $" "VC version number.") -;;; Commentary +;;; Commentary ;; This library makes all the functionality python-mode has when running with ;; the normal python-interpreter available for ipython, too. It also enables a ;; persistent py-shell command history across sessions (if you exit python @@ -31,13 +31,20 @@ ;; To start an interactive ipython session run `py-shell' with ``M-x py-shell`` ;; (or the default keybinding ``C-c C-!``). ;; +;; You can customize the arguments passed to the IPython instance at startup by +;; setting the ``py-python-command-args`` variable. For example, to start +;; always in ``pylab`` mode with hardcoded light-background colors, you can +;; use:: +;; +;; (setq py-python-command-args '("-pylab" "-colors" "LightBG")) +;; +;; ;; NOTE: This mode is currently somewhat alpha and although I hope that it ;; will work fine for most cases, doing certain things (like the ;; autocompletion and a decent scheme to switch between python interpreters) ;; properly will also require changes to ipython that will likely have to wait ;; for a larger rewrite scheduled some time in the future. -;; -;; Also note that you currently NEED THE CVS VERSION OF PYTHON.EL. +;; ;; ;; Further note that I don't know whether this runs under windows or not and ;; that if it doesn't I can't really help much, not being afflicted myself. @@ -46,14 +53,15 @@ ;; Hints for effective usage ;; ------------------------- ;; -;; - IMO the best feature by far of the ipython/emacs combo is how much easier it -;; makes it to find and fix bugs thanks to the ``%pdb on``/ pdbtrack combo. Try -;; it: first in the ipython to shell do ``%pdb on`` then do something that will -;; raise an exception (FIXME nice example) -- and be amazed how easy it is to -;; inspect the live objects in each stack frames and to jump to the -;; corresponding sourcecode locations as you walk up and down the stack trace -;; (even without ``%pdb on`` you can always use ``C-c -`` (`py-up-exception') -;; to jump to the corresponding source code locations). +;; - IMO the best feature by far of the ipython/emacs combo is how much easier +;; it makes it to find and fix bugs thanks to the ``%pdb on or %debug``/ +;; pdbtrack combo. Try it: first in the ipython to shell do ``%pdb on`` then +;; do something that will raise an exception (FIXME nice example), or type +;; ``%debug`` after the exception has been raised. YOu'll be amazed at how +;; easy it is to inspect the live objects in each stack frames and to jump to +;; the corresponding sourcecode locations as you walk up and down the stack +;; trace (even without ``%pdb on`` you can always use ``C-c -`` +;; (`py-up-exception') to jump to the corresponding source code locations). ;; ;; - emacs gives you much more powerful commandline editing and output searching ;; capabilities than ipython-standalone -- isearch is your friend if you @@ -65,9 +73,9 @@ ;; ipython, you can change ``meta p`` etc. for ``control p``):: ;; ;; (require 'comint) -;; (define-key comint-mode-map [(meta p)] +;; (define-key comint-mode-map [(meta p)] ;; 'comint-previous-matching-input-from-input) -;; (define-key comint-mode-map [(meta n)] +;; (define-key comint-mode-map [(meta n)] ;; 'comint-next-matching-input-from-input) ;; (define-key comint-mode-map [(control meta n)] ;; 'comint-next-input) @@ -79,8 +87,8 @@ ;; variables comes later). ;; ;; Please send comments and feedback to the ipython-list -;; () where I (a.s.) or someone else will try to -;; answer them (it helps if you specify your emacs version, OS etc; +;; () where I (a.s.) or someone else will try to +;; answer them (it helps if you specify your emacs version, OS etc; ;; familiarity with might ;; speed up things further). ;; @@ -106,10 +114,10 @@ ;; - neither:: ;; ;; (py-shell "-c print 'FOOBAR'") -;; +;; ;; nor:: -;; -;; (let ((py-python-command-args (append py-python-command-args +;; +;; (let ((py-python-command-args (append py-python-command-args ;; '("-c" "print 'FOOBAR'")))) ;; (py-shell)) ;; @@ -127,7 +135,7 @@ (defcustom ipython-command "ipython" "*Shell command used to start ipython." - :type 'string + :type 'string :group 'python) ;; Users can set this to nil @@ -138,7 +146,7 @@ (defvar ipython-backup-of-py-python-command nil "HACK") - + (defvar ipython-de-input-prompt-regexp "\\(?: In \\[[0-9]+\\]: *.* ----+> \\(.* @@ -181,16 +189,16 @@ the second for a 'normal' command, and the third for a multiline command.") ;;XXX this is really just a cheap hack, it only completes symbols in the ;;interactive session -- useful nonetheless. (define-key py-mode-map [(meta tab)] 'ipython-complete) - + ) (add-hook 'py-shell-hook 'ipython-shell-hook) ;; Regular expression that describes tracebacks for IPython in context and - ;; verbose mode. - + ;; verbose mode. + ;;Adapt python-mode settings for ipython. ;; (this works for %xmode 'verbose' or 'context') - ;; XXX putative regexps for syntax errors; unfortunately the + ;; XXX putative regexps for syntax errors; unfortunately the ;; current python-mode traceback-line-re scheme is too primitive, ;; so it's either matching syntax errors, *or* everything else ;; (XXX: should ask Fernando for a change) @@ -200,20 +208,20 @@ the second for a 'normal' command, and the third for a multiline command.") (setq py-traceback-line-re "\\(^[^\t >].+?\\.py\\).*\n +[0-9]+[^\00]*?\n-+> \\([0-9]+\\)+") - + ;; Recognize the ipython pdb, whose prompt is 'ipdb>' or 'ipydb>' ;;instead of '(Pdb)' (setq py-pdbtrack-input-prompt "\n[(<]*[Ii]?[Pp]y?db[>)]+ ") (setq pydb-pydbtrack-input-prompt "\n[(]*ipydb[>)]+ ") - + (setq py-shell-input-prompt-1-regexp "^In \\[[0-9]+\\]: *" py-shell-input-prompt-2-regexp "^ [.][.][.]+: *" ) ;; select a suitable color-scheme (unless (member "-colors" py-python-command-args) - (setq py-python-command-args - (nconc py-python-command-args + (setq py-python-command-args + (nconc py-python-command-args (list "-colors" - (cond + (cond ((eq frame-background-mode 'dark) "Linux") ((eq frame-background-mode 'light) @@ -253,7 +261,7 @@ buffer already exists." (defadvice py-execute-region (around py-execute-buffer-ensure-process) "HACK: if `py-shell' is not active or ASYNC is explicitly desired, fall back - to python instead of ipython." + to python instead of ipython." (let ((py-which-shell (if (and (comint-check-proc "*Python*") (not async)) py-python-command ipython-backup-of-py-python-command))) @@ -267,14 +275,14 @@ be used in doctests. Example: In [1]: import sys - + In [2]: sys.stdout.write 'Hi!\n' ------> sys.stdout.write ('Hi!\n') Hi! - + In [3]: 3 + 4 Out[3]: 7 - + gets converted to: >>> import sys @@ -288,7 +296,7 @@ gets converted to: ;(message (format "###DEBUG s:%de:%d" start end)) (save-excursion (save-match-data - ;; replace ``In [3]: bla`` with ``>>> bla`` and + ;; replace ``In [3]: bla`` with ``>>> bla`` and ;; ``... : bla`` with ``... bla`` (goto-char start) (while (re-search-forward ipython-de-input-prompt-regexp end t) @@ -302,7 +310,7 @@ gets converted to: (while (re-search-forward ipython-de-output-prompt-regexp end t) (replace-match "" t nil))))) -(defvar ipython-completion-command-string +(defvar ipython-completion-command-string "print ';'.join(__IP.Completer.all_completions('%s')) #PYTHON-MODE SILENT\n" "The string send to ipython to query for all possible completions") @@ -332,19 +340,19 @@ in the current *Python* session." (completion-table nil) completion (comint-output-filter-functions - (append comint-output-filter-functions + (append comint-output-filter-functions '(ansi-color-filter-apply - (lambda (string) + (lambda (string) ;(message (format "DEBUG filtering: %s" string)) (setq ugly-return (concat ugly-return string)) - (delete-region comint-last-output-start + (delete-region comint-last-output-start (process-mark (get-buffer-process (current-buffer))))))))) ;(message (format "#DEBUG pattern: '%s'" pattern)) - (process-send-string python-process + (process-send-string python-process (format ipython-completion-command-string pattern)) (accept-process-output python-process) ;(message (format "DEBUG return: %s" ugly-return)) - (setq completions + (setq completions (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep)) (setq completion-table (loop for str in completions collect (list str nil))) @@ -376,22 +384,22 @@ in the current *Python* session." ;; to let ipython have the complete line, so that context can be used ;; to do things like filename completion etc. (beg (save-excursion (skip-chars-backward "a-z0-9A-Z_./" (point-at-bol)) - (point))) + (point))) (end (point)) (pattern (buffer-substring-no-properties beg end)) (completions nil) (completion-table nil) completion (comint-preoutput-filter-functions - (append comint-preoutput-filter-functions + (append comint-preoutput-filter-functions '(ansi-color-filter-apply - (lambda (string) + (lambda (string) (setq ugly-return (concat ugly-return string)) ""))))) - (process-send-string python-process + (process-send-string python-process (format ipython-completion-command-string pattern)) (accept-process-output python-process) - (setq completions + (setq completions (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep)) ;(message (format "DEBUG completions: %S" completions)) (setq completion-table (loop for str in completions diff --git a/docs/examples/kernel/HISTORY.gz b/docs/examples/kernel/HISTORY.gz new file mode 100644 index 0000000000000000000000000000000000000000..f1389ed07608ff2bb2e17010a5fca85dcf020b98 GIT binary patch literal 140542 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

uCq&1#KKGXi%rLx(~45omY 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%0D#%8C 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

(uw&2* zGD&Iw$uKEJdonZ0y(}S{(oB`1?%tKE$dqDjr#siWec32~86VA96@_C3q5^%^j-96j=}8D3DUa!|NGwrH-?-7dTLfur`|aS-i)c+l=@Q@L`#Pp+GogbIL|w*J>VC`D=rAiJUG@WP#=}ml zvZevIB7EL@j^5sb^vM3f@kmL;Mrm7cZqnuIg-6zmB(8k=;_=fbPkd+@T>of8dDmmM zDno~*72@C0K^QcEy4|f7rwH)~$y5aMt=t|=LLwcYTF!HmN{YEHR?}O3el2afkjZm< zVldVyPoLh$rb453RfI%(Rxc1XBw7VdWn{!q+McIRp8za78Z(-g9PY30I_>s8xNApF zROMGSYk9Xe`+OHB&GK}i;lc%3ritwwDZ?roGy}Z?&MLunBS~lgSbqEoYEVD_;{E4b zL{V{x{|b2_6v{NsZG}Tx6H}^G9Oe=1#JE@l4MMc)$Jr#FQww)P&p;+@rs z8kpRjJKX#6h)dv;8;3r?I9iHnvI5@c40z(pl^?b~`6%9e6_sR3{R68)Y^h+8>eRO_TaClFV$! zL+Crnda^)!wjay$i~OyBU>`C_{#sp+t@bKj2ohX@T;zl)rtkvOp5_(~WE4126cyZ_ zIz?z%_cnfKUj^eM9*I~$GeD!HB_GX3K{|dV39P-<8r~(yUnyI)^rpGrl{hT4T}5(N zDSDN?EX>Z5aAu08ausswD8 z4BrTUZ-=lvfYcB}7f_SPL4M&Cn=G5^I=w%9 z6T?c%knLSeY~D;zj>ycG7j9KxTEiC^G`97y_e0Yvw_l7&jjIYA1RNY(Hd1@X4*tMs zi?`T+!H@Z-^I{R(&+I#9-S6luI0&E6lCAP#!)8zkh##foUD5-mjDId|t_}TjS%}aQ zfCF|Yr2!>6_bPtjq$ll>7Ng_4i>0*py7gN-%bXwj*1}Mu*MKF?)k4xyW=TS6e4Lt1 z>+7)YTIrDw5ce9FPB@Txx`=Kdf6W}?g%zY8s(#zI$-{EH4H~7ho{TmSEY~e zE5$d!BlJ&*sjr+gGKN@Sk^`0|*VyEkv|~xSLHk<8WnJth29Ck+ag&=d&bd!~`i?(8 zp!&iMzaX%F_~N^e8c6S8o`}{UgxDc?C3Tm4HS@xMZ?kUm+wp1P51KDoyQ~7Z8P49o6IzyVPcV7tNhZFKaSc&D7A^# zcQ4|fR_{2HM6MhHY z<$zwMh&PP=9*g+(itQ@ncjJ64{jZ%rCS9z=N_uC7yXI7^9&+JX|M;S+j>qGE_&ELJ zerlxq{iJ0$HY0Md$JTgL3!kM-EZeVQV2Q3GIYFCp9%fb<=M*iIuJk}3A{#w;yUacW zUDKoc=@TNet!l2}7U#?xbw1qm*E-TW!yOaox%Gi%eI`r$=~kUEpH-_wjMztn0ly9; z>Y)X%3?m79At2i^hPUj#@S&FLE%3X_Y_84H{@M6Uyh)=7tgFz|hA?qKSJHUduKpHR1 zceMt3?O2{xN805r-BW+VV#8HO2Fh#whu*U#D~SqQ>mivO^6%ehuRJK65=TG@S`*(* zdjA7xXYdt%F}?!#;^h)QJG0-1AC~Xzr#3Bro#tu=LgP#_k~1kg{>9%0 zXa1AY8~z^h!#v+D#9PH8|ED$t4}@(#ZMjPb4z)6qqF7=(RDst`uw0tLW9Yt*eA!Yz zyuON;P%V}{tsJf&)FK7ZQ{)@v!Xtnw;OB??P2(nj6s=8*t)aCoSpT?F?)*AC>076% zZA8~#hpX4DawpQ80&6c-$_aXy&TqaZXN3~R!;Ey*Wb{-AXIm@ZL@ahg9GfPpBTo&i0i96$ZW}?TQOmJh~W?-tigq#)|sZksxv-aRcIy21u%87CP06AhStJOBT zt6M#zEg`%^yilXS@ps_@{gVMhc!I#QQHiyCLWbA2;dWkwR8w zipY$?x0GHuRoen4&Xzc^>bp7!t@wwRi1yX3_L==~+R7F_pqc86#kRgu!cx*4C*8>h zm{|^7T@GlO|7b}aJHeu-uX!sUVp|;Jo#A;?1-jAMd)SY*F!0i^&8vLTwuI=xFh>t1 zdj;~SVwkYixD*E&Z3#}T^^Q2NqeHAs`mMXw*7zK0Ps?Vfhzdl5ri-SG_-wF=LU5C; z%Z;zHOY$E-D(}nU+Qe0aHpdTJx78+X(b$j zsDh*+hWqusux9pPHYiV)DayYl$e}`5tmL;Y#ZCDpX?$+0awNLdx$~o z2Lp+y#r%+_=;54@DWn~kYYqInrk<#PqPDd4IB5KpgO;LVzGxWXGa+L{4$yyW%lFtC z1yIFHNRhZV-n)6L+FNJ;_KiZb%BC;=c+C0$=IeLFRD=hY3D*oN&WpkjAd3Lh`$KsF z!ljVtXR5TkT!|CKcLFnAej$lsWta%Td~$7XJ4^y$ii!Z?8fuSP}RI zNBII?v4o+rNk!j1!H>v^ZhlZZI%)gc6lA2)r}5kDQRoKopJY*OM7uk=CWao^QmI`C z5?FD8b>=UI)PaAcD`}8Z8cPW?(uf;xtbpySD!{wNN#iaWs*5Zb1utAywa@;!*;orGKpqglh33WNz#i3&@)EO^7VBEX>oRD?{yo-zAbBUe*L$%-@STC ziKB$QG_^Z|_4;7bj{A+Ng*SVBJ<>k8CFMKj3)3L2o}v$dVSmFle@FAypR>W2pkVk- zy<2GAnl18j38QD?c`IsKv3?_RdDzX_L%T%LwH624y08|Z>niDZSq8Bv>X)$}3tpju ze5R%JWI>&reRouZ4dQ+IY*uYov6aC(#%e7IX~uFD+}CPbyJSFx$pN;3?p^O?aa}6| zLL9GupZekMX&1k&+kSwF$Qnuy|04FH(Bgh~diM6!o4<94YXws+T5lE*Id|vi=ou6@ z_P5F3hT0!TW(H@wu76otF*Packi^G+Cxyeu@qc-JC zP^VAxjW;Hnkqgu(w2o*Ajw#dtDggp%kPl=1EhNi;zgZ<&Zv%=5Uo&>_)z00?{Qt#V zN2vHdG*p?Y5QVGAw7F(mrJPNRn0ma*psOSrq59KS6_9gNj(GcN5Wrt@o;--(QP@87|9|q{vPf;!XR)>yCY4N-bj`V|d>(4-{<<5P5Iy*$I9m}e1A(~s|9v1p7bVFb zyOgZp3!{XwP8x>nLBO5_Nf6~kI@cAwDi4Q}HNcOf(fdZr=K@YejF6o|- zqzoGYf>w=aGL+bdT0pi0qvJ=4d7A4DLaPI2XB_Qso`M<4a8*n5r!evwl!kwm9mR-E z{HGo{d--sOxu30*q=zY9m`Iyk~T z+wyTRLf3*32IurP6yc+V%D8CbgzzXiX$Jpf$fblO7JG{Ks>ou`n15GlUKV+=Vd0VI zoBVo3762qZK-!R!-A$5Od8qGO@(96+N>f;`>PX64(!j$adI!AJLGeY99qXe3)rI7d zk1qx{Xh&gf`O z4m@E3Mb}LhAc$JtRK!=9npUjEVu36=Q+6C3Ei*~@C`(E&d;BJE$f92fQl!Xij>tts#Jp!4#BH&5^%j1?=I4@YYDC1nY})#qYBlp}a%z z=`9j98W(wk4LKOGL_9RaxofJ~hbNJSWz}!QRyo(cHFq1&+@z%?>j#+OP7+LO*Dlw` zCunhj&}i!HjmeJUe$ z;KN8>Oj9&1;6!ZK#5+@x*O^CP6ckkE4GAL=^dp0ND~*AB|0#Q8ZjAZ zJ}>my#Yy?OinYt-7&;$p%zx%9-- z@zsjC=%`rsE(!%&Zz2Bfgh_;A7xReuY>iPZ-L7K)yRCky$r5yVfXXflY>Z{S9BKA~ z8wufR=vCGMn`o5o1T^0Y$po^h8aviXISR5t3C7$%xTW-P9I*u&M&h~7PM^Jf`sM|7 z7*3yk=Z6pX$`|839VRoqvGvS9*H)L>qU7e~j<@yZnC{u}v|Jr)CncIws`a{3q<3RYAG@kK0*1X zk<;?QwW6Cp{qs1PfIk#ztW^qCy@_B}H?T+d z4rU$XgaJsbXSw(5v!1{GYS&9~6R?9buuteQww79myxDRM6zDFZEP;~qPx+Pi3-9r# zufO&`$}hj!b#`*K&%X&H*Z#hAO69D6-Ql(3!qQs^FldmVLET|MElb2&#znsv%r-jD z`ISm!+GblnM9@u{7wcj*ug$I?A62HpxkiQnas)7xczay((k-XXX-aC4Tj*O_MuQ7n z^6Gv;NqeMsul!~3GPTWvCT1iRS;yBfk+j?j z4aB8v>_v6#^%?2rGss4N=%eV;qb?2PmuPe zX2!)l-zD_sBi?wd-%}9O{7oDgQGI#rQPAWHu8*0C{ix1NPN1(}Lv2n>XHozZ? zfs<@iimb4A8rPSbwaLen7pX|R3wt&?P$nep3Gy>*(Vxkh*=4*&GYc0)qATU~vwlqh zP*@OJw{bd*d7?;E?Qrb^{Z&iTgaNd`pCrGDm7bsd???XTzu=EPCJnh3@Fa-~=N+0t z`#GfL(TE?m2>{oiQjszg0>3Q!E1eMKt>?kh@93OR!Db%lUZb|Hys33r3Orcnj%Yit z(O)x2_%PTzy@~$z6uI@HnU9=N$-Xbbg|P#zl=X}E0@ETb))`WXSTA+6Z5yP9f6zR)au&Y%Cj^{&5^o9%Fq8Weh?NA%HQ{ z+pP@}^{Bg&Ld&Iu5OVn5eg%pZf1=aQHDl@&u7*hR-zk@jjCcX@4O=F}X>e)%vYH7> zbw-S~k^&^%gi^8S0{+|BYvSc?J$I4GfdIQjA?^1Ea>0$Vet&46QdObKsK#rZ%q$qf zSD2(ev-K`EBxI?Zv}TKZ1iP!cHKgEXCnN|RIyIYcSQFb-fH)RCuNV6KeoV z)x^3H2&W^=O|ulzK0WFr5O&s+u&!cN$;8z5qPY(l5LgVe4}L!n(CU`n4WzD*w=4X| zg#4Q7IK}5i!{D zE5GWr^<2zW%_6)`Vm%5aQ}JOL2J zOOE|9Fz4N8S+4&X`&L)&tp^VAqRHXU1>A2S8gI+fO6Bj_%kQ%num97whXb#^oPRFa zs{@CNs>5O?ZAUMjeD0X%3%$bDylY9zK;;>%UKBa0BXCUor$EO(F_oU61*wolmZXyQ zDpClrGr!YLsn7AyZ_Td#@$gcuy?R>t-SVN2f3p1p2O!nmuGF^ArM=MlpyCK}z5K3? z*SW#>z$`UeKZwX`wGc!tSvF;cO(xPqY3*Xeuks{dcG45yHd;nDf}SPlYXNr!8ht{M zF4N>Pk|sz>$riN31po)%t`@+<(Y*p=bL~{xIhI-VQ0JyT@SHV5NiRRE3`n`Ek;tL= z0uePVKg;f^lH0K8&dsVtwef+{BusZn0;ynN(Okn6% z|KeYFwW1Q*gl*wv=+3aU^YZ1}*A^0ZTVAd)^R|r?jhZTAlQaB{RDkmK1vJZ>K%Nei zaePoYh7_i%rVfT!E>$tg8XIXzM($T~JCUtu5{Y1hak0Z-9r7p0ZQ|>6ceMQaT?%CD z5Zp}ALTMhl{5Ur+$FaMzY_?)AY)|BWla^W~gFE0WP`+9+hmfyUEtzVQcB%UprLG&x z))NtsYqw0cume0Sax?prtK84UNk|ade27v`I_M&-dHU_Q`fq=#bazc88_xT@{m)i4 z2+zBe<{e2Ws}?54S@Ttn31N!R2%v1_|BUEZcq0@O=_4wC%&-j+lU#$gl&QJxVejuH zl|)I~(65JGX$6+Q)v5QP!Sjhs zHzWNwZi5ce>>oJJ(#lCJfQ54S?m{nYn)L4M)yaQ6eS7PJcV*BdUf0zKkGW`$eemfl z6|#<8_TmG!gLUOiRRpQtPI=L^l`#|GdomRM#t~*~aM( zW;X;rrpJ+%sjeQZcT%PD>zD;DO?@5vYaGk_jIV?uYfX*X*?jITMpulP4ZKs)L5K`X zCr?o0+7%ltqRr)We+@-7I9+!D*IiD{iVZ^IVLkQVbz9pc#Y-f!F~N$hl=oWsl3Nd| zmIC@{Z(g6Mjb`@SS*8Y^KNz6Rde%aq&EUBPU}<~j{^5roM%fRKPS0rLo>gmD-2p&& zp(`O_HPdDg#pH=$1L`IX;_WG}udl~WMUX8c87|QHh5O*DSuXeiC08ZGTk~&zpVwX( zZzRD#Zj{g_t!qT$S3A6dg#)GVs0;l%vI$c0;w~d|M;gfNIF76Twfgjj68G|W4xj8&-tNd*gw zMRqBAm7H-|Z&T;i1~va2TS-q&E^dmAWWuk+fo9ch{<#afCt4u#PBT4r66e$^Oc_MY zB+PHQ(P#$6Mcp1T2tBzfD&E~SJ^Ia*ES zsNS8d%(JHQuGJ!Yy2g8B$yHGi&A}1zP@szd3x?d~rPU4#$N8jL1=X{PS|=!}if77uzp_%IvcFQ*5ZE zUYk}*`P9~Q;a5}TH^ls(JEUN!C`%7iqiI#{GZhi6dlMu@Q%@zuVAx+kM?u8KB$5!j zNZmi>17?r)k}|^p9bT1}SL{lkh;J?HOE3ml+crg7w5y-o&Iux#4ZoiDeV)H9{%RGS zkPXqjm=Rf&P4S`9rjh|%NzV~{OeY92*c=5Bh~1H-zPav_Ryuw8?JKyDVu@6}tOBcs zCI`fRC{F$gf(Q-doJF;$jQ{nA~e6n7Sw7&<0U!na74{Sdz|H$cL-f(iGb8(?iZu+2W8b z%U*u}{JAyvbCN`)+LRbY<#PZqbR`VD#s^#0QMk2{%;}<}G?;YoeS8a-B<(-gx%IEN z5Pkn4IBjGjOu`WZ!)bq)vnG9^+8s$#hMx~NKb9bFCct32i|XK3G?RSt`MLK?5&Z@Z z%@UZM?ED;CqjB<$h^zS5Ah)NH8$#C!1!`7kU@1`Ki8=-W<3f_Jfek{IWiN`{>!35zh-~K>HN@(>K+8JTryFrdr@1CLnEksbQGd z&Li;6?dq0Gk$FJGEhk3MS+Gt6220YlxTzPw8Q_diuW#BiqVWNeH+`6B< zS*2SoW5*zs{A_w1WA=;pWe&<=hj=E`(J+fU>J5Y*-K+e z&bcQY;A`2U4Ainf5N(zW%Bor&oxJjKz1q#8(mQ1H#r){g@q_WFt#0rO^?wIa_ejg-+NPJDQ_DfcA??{yY`h0EkrFb-%PMB{a#FJ7q_>a_%;< z(oqz$N|do#_#yyQpj+hldHTP;fBN$6|5+ez3$+=L8UL2FBAc9Pk~}FB4+X^=Cv@zE zVO#y)5*u5syBX<^l*vZfnw8<}|1(tGbMm|-jH3rQOp=D1N_S*cqLn)vj39&$O3V@6 zidbv=2haReh&z3Z77;IUdxavHRw^(q70?-JJWn76XOd-3P}GpF-r;SayxT+%W|fba z3W1DGxZ|@Q$!N(^{-1+wqe~}kZmIjpQCL=z#QRsc*O(N(P{I?{-IWlhXehvA`n5%) z;P8PT00~a4Bxg98KsVDUu%!)y;V&L?TlmOP&sw7{CeChZm&m^U+VCX)8_1w4<)}?G zX$iM4sds2yT9HNpdGT{`IV!fJ%hC21Acr1$$FywLr84kogG-R}HXcjoE*Ex@fB35a zTjShC_?=~@Tlmb8F$U@%t7$z$*&8?#Z*1rJx{-2uK&0FPOZceI9qOu+P#xY2!u=~U zX}}N7ytIFTrYc)byY~|sQ36ux_wA(4iv?J|2wqVIX9m!51laZGijLlKSnytbhuEcDeLZujEi2L zo+T!JkiW~bT|u(yHL8C8Oi3J1OzDY%EMHTL;wD_@7t&>Ew_~NCT2E3xKS7B}At5Lo zio3Wydj9AK+KER`UZ1@1=2D~xI&U(YcapK1BRe}eJIzj>ym|FPQ?OYZS(QHC-`9no z%M77ID(8Q`e)=qAVbgnh2T;#^$obO!l+KmQOL04RML0q+%Uj=eF)XUc7S?$u|CfH9 z9s55V%Ug6WvR#FXygxi1k~2K?_UqXs2@h0dMj2m{DKgMs=~re6M!t_QPxbrB-02O+T&8#+q!a?T?v@iSuuH{FNMzDDWGNWrEC` zVixxf^H&X}K$j~rFJH8iC}V!$tN8}scUD~j+uO?H3sX|RURdL}TAx`wO{j(38 z{J!`&oX#K}F1J|DcD?qKYhn#&seT&1GN}oKfZ=tqSsW2MsZw{YBX#F2GdziD z>$Y07)c1@j-c0caPUsZ*kV~G;KXCnc=)am-1*GiAn-q+RY9v_-nnFkk(@lu$H^s$* z00#$`XD4tx6VqZIrM9qLlhBr4k@j(M6UFZz_@I>3b7k75XHqe2#8*Fil=1~{j0#q1 z?O2wwii|sHNtRrLY)D(QG~FY)NfLx?k?#kd*T41})8I=?Sthv`JE|Y6==MBmk4S@F zIj!#ST041TO-4o;yT87D`jRqsP%qthSA>Y|cJdce{^>CRH}S(-#2ewy*aa9XLSLC1dBoztJ!fYTV#0h*Hzt|Nl8}j(UJwBlto%- z`4!>U)A-`^>}|R93l8JgPfH(dp|(*LdgL@i;qH&`eSuPv9C$3YaJqrsFE~~-r{wp! zw}rquvlrv+@g`rbs?`vngs4B}tV(GWXi@spOKuUg2dg2!T$J^i_FXdmiIh!B?IsOZ z*t%%FWoyGY%SH4U$IsKT-(@2Xi4hoysk~siu=y;ZeoDvp{{KbD){|C!I zIQb}Av&us|xMY%8#|AKVI^i;+NGBIyjtdrQ7@x=BVOj-y{OslV*`vQa&5ko~cjU(o z(nW)SrgB=a%T&t_cyly=#i-#(jxOf05JT~ z1B5k^b9SGu6g(?3UE?2TS3ixkV~1^T0>pUyx3^D6*~xd0-Y9dmbP9{6-m2Ma_0V=D zSh<@(Rj3>>ieHoNHGk9|S>W$v;rk*Re33m`Z#3!qu`GNrtYpKp{*5mt?#N%bvnf%* zGO1thcu;5WwW7WEMgvw#{=#Z4-;^zVoEJpe7xgDYcNEaBZ?u^@qM(#DI;moWfFYq= z&`T()r#BuS-zMwW%R~TDCy{x`;{8;Mxy#hIGL=%bi5+3j0m_iN!i&W)d+(hbZ24M{ zMubnkOKd-U!^aAA(mfn6JFC_^a)C^7cYxeZvwW$-jpmHuK!y7GM@ztdotz9x_ukJ0 zWN}j*b^qvhDeoy}e*>rK%4K4?K_NgDa^X~$G%>#6SP`vbe)WOh)ZSMkUI92(PHmGY zN+*qx^??Gx|6|$c7*0^P!dorN8&fM{NnA-K{CKm#?jQ6%>7b4%_Fx(h6_lj5Yrkr+ z((Hrv{a5MpGJPhj`r^}6RDttXd+6WNu7G4#U-WEPDCV}^SN)E@znw{W80J!Qt)eod z;9INUOIaBxhV&G7q%;n*b5T~ZfAJdepUjtncuZhzk>euhKw|<5ojLpLF%N{vY_9i! zKb_o!|4i;8e-5|V6l%%X*|A;OwX)=nGTvP|5kJ@bu}wY&Nw@r?1~I*An=5Gb2pl?v z$dK10mr4Riei=3aZnFPD!gQ%=URWK~|8{m&F6RDqhv8CN?anxKDeFjib*2hdSN@CR zcq!Ws^_uqWE@!b6V(vLU$$?ujOz(|jOwhvsJ-IzGX@bhA zi(u~rVY6N2$=_Z+fA#2zT%vq0E!}kgadH*8!3peJG1~|_9*}l2Ls)@(39K5f zGB2jvOHK(Yhguk=p>jw`uIE!C+?r;01h5>kdn0^jD1prV173UYp}G!#8$N8|BfS5& z4l3xn)0;o}i4!OT>0vqrEcsO^V#!Oun?Q_(XYv7T&ksod>#zGZQ8~$0!t_o#f}k$= zaNiLr{$XB7iAmQcbBxN=ZRf<_@O8SJRAaEdDleKWh?S6EC^(b;oaYHozZ`tL%fh@YhxJo6Qq&$8-sB*)mHjLt%@v<&*t3snEYHBRQB*@&X4alBA;kZ zfF0ytQ*Oee>@134@FSD_>3S9SZit)VkTKIWw|HltC(saYDPLeAH&uN_78-C1Ny-P+ zg9k?B{a^@}E)gCL+9N3+UPo5(A-M9>GM&BUnTI8!O;W%%X`m)=a%kZ6v z3x_s7{mVr)%@-|+;!5wI$=?!5HAV-xZkaOpX*sB!EjS3-i|yj{&XB7LQrLo#Ls`8B zXTALH@#M~(JAcT2$gN2rdpz*=_|6^pXvk-s3y?+-tKz2JxkDTU-Q%{jyf=~Cda;X_ ze=>MH+`GdQ;AGPKXv<`JE6zo|pL=0d{&M9HD}~wDd+kOAOs_KB^TputD0{Mh+ZT4* z5uU*AjdRbd%{h$wtq<^4y9u%qGrRHQNS~!rqV*}zNh)hEoTE4Ap zpq41p7iam8Q)?to9^x$#b90MA$mii4Y^XA0JfDZGf^xXZmHcb^U6l?)o$z_^vqfU@ zX*Ewp{YC+=I^S*reo7qv$lQe*4_lRB2n(fSlIkY?@Qz8+u+#{(vCPPG^|0;B)Gw4CV z1T)C*ELe5^8h7x2uvqSq4HMm*J9i>n0QI|Sbrev|VLB(sJ7 z`i)-(WjLD5NP33SBmrBH-bIZRf@eH&ax3`OcJ9jiO66Q#w^4^om0o!J&i_&D^i(uM z;)7GO&t^^cL0|c=a^W2gJx7IyiT%c}yN91~d+k0Oe|e{S>|fw!b`A~RFn!SO8UI;q zD$6FyiF3;>dJ_-CX!neizfdytmHw?Tu!C?{|G3tIH>h4ze1;O`$^FzuHgr z>f+*v#WKHiW?SV2X3%!l_?745{J$61KAhqn`^2w|Vv#-1pO;fW#JLK|oPib=!1u)} ziZj%&lQ1(-T?f*I2n@!~2L&c=QJ$;bid4Cl{wC}74oYxWejvSz_pTt7q5R%p&3VED z>_?uqhLE#Bl};{ll^`d9-r*3L>BL$P(?S?b>rF)xp$FJy^^$!@q2)O&O{ORPu;Q-X z_EBCDNJw%-`&Y!aFV-_V&FU@tm(As>ZQO_wsvUjIEB}BCE=Q64O7S#4M`<;V8&8K~8aA~UL#(ItNEU9qaJ)>oyetAxKt)xb?YCqFct zT@+5_{lF^NQb&m>o>c#&DA@%>C^wMYiL8&xueela$z-EcwprZkw#Evyz4&Ru&C$e4 z9M`Iw<&I4c_duSzr`KW|pIFM;seo_FgAtXdMwS%f0}l*rIaKJ=o?J{z1}52#4hZ%L zZ?)|i{=@v>CrZEW%!2=mE&}p5dHqhIJKk-)CWY-t=BuCBNMQ;W5Id>O86nC>wrc-9 zld6w5b{*ClB~np-KYf9)$sZCNqJK#qZtXnea*|snqap|(i?>o4`8X83oxX;fe8%NK3}LEQGRm=9kZe0T#k@(p&9f zgud$N`vkguX}fC54^OP0nu)+4-Cg!k(LrO9+GG?k*N!u zT-H=2Y?G0Fwsy8nTbi8Jld(PotC3}wqn)p8hpb09$O+$dAm-O5{12YTt0Q6ZC@8BR z-n8Xa#4n39O^bkxV|hfiF`53G5bs6uzI?A%nlm@i5+%$AQK-*RGGW*?=C{ci-XcZl zQhCOL42yJym|Bs2k44g;ba+4zQJHKu+HGu&?r`oE_ABe&zbj2aOGpy?mD0U>W326u zQErIaSxtN~_x_o>b^`VEdz*r2nGdQi5{gmTu($+UL)aZ9&L!J5lHs_lpx0ekaja2F zP;Uc+_)0YO;6Smco3slZ$w;l%&>=6|>W#6YK$-{6#<16>j9)gyW`9kxf=M(bk4+(% zcn+gAco^<_%ghb#W_A~T=3Okk&p5s98Eu)io-k~% z>0TJT345cF0 zjkg>zXWN%xQ#n!M5$cx(TyxR+{OTb}yWgEyJJJ*)-U%IN9n0(wwSxvchBYPmNsCJM zPn2ckGDr7+0`^-nyDNb@hiB1zdwgHhTw41*rw|3B&@?|SoJ1WpfC*C}x`3Wr0JiAm zu!qDVs5PhuAIl0@WM3mL$sff6eSY-mP!icFuY!as?G(3(AwcG(&WU7(T_mpXL2S*( z;c-8*#P}&1GT)QO7zEitY65XD;<}R`PCvTtcxy3IlOw2;2mbV{>bf>yVc1&-#2&EM zjP83&0Lve^*`X%L6(|znty<$qtNofL8)bXB9OY6ux~1M`-nL}Lj`s4PL6Ip1wT)X< zKe>dY)dSj;e>oXE_Je+Zl;J-rAPf3UKNo=yX@0GEbaX_q_^l8&8CM@^1&zDL&u`*H zP6Wha=%{uLyV`h{<*Toc?J+fwMU}#^71`}+m&_B9SMWma6u=T$^mS%9Bv)q^m7?Ppg-7dwL zUVZ(=m?emKC2_KnJW|58UQr!rD~B){1|R3y4|Y*!jOe5$$I*I*b@n{{lw5S@X{dC{(zPCAtO*07vA6 z0kX)?o)1%O=XN!O>xmQX#ab*2ezK22C3QXBRQVhXaRU_i_&Uod>{N%n>iirz8 z|4Czt^K&6clDdiiC+A2BxT=6pj9y;lh`n{TtKdkjaK~CjyE_a6a75B>JGMxl21W83 zj}r^hN*ga(m3nXP2!BqkqxCl7Taey5pObXUsGw9#XlK<-u$G;Oz@*o>L z@*d`L^;^*--x&p7ngWJh51oW~vw?`r4nx<)!vLR*RgO(jZ7y?44%rkjBUzyja+}o3 z9wPNzB4$NaJ1IH^hr}BrOi6Yumb1VZJoO&)yKJFk?SVs&eSGS0-+;Hg_`C#6;hDB$b+x$xuIJWwa?3ac?7VY^0IN zr6xgCkS(djJMW+siv@J$w$Q1ScQ6ROU&}sP;hq}YPkDJD=FQIe+5hesaQ0*HlpMdK zj+SiBOG>I(ZhbT)w5h^K6`+R$CO=U8W+c6?7Q0LO3=zbX z*kKUNRAg4fyNKG@EkZngH9oaQBB_vGguYHil09%A(O~#p43)RbB@vDn3M4@8nDskk zS}6jJ?T;XY&W%P+nLe+D9NcE72qk3MNjx4H+f58M*+*a%Z<2`g0`+Cx3yrwUQNaS; zA7>w6m{JBlAV!6!KT$+Y0Gq}~BQVOa+Q*LKtV}L5!`nkJ-xq`?oa1ZYE7g952M%gj6o< zI-VBc?nnx7zgBsav z%Ql32on6jmvQBUVe;@B(uSiI6q`S|V!7@%dsVPfsqzx7{KzM!q)R=&0vR9XsHxw-Q zg$j5pI9Qlo(9NVUfymNsi;^`DJ<~u0U5cYDKuFMrj#RR0)HRir_>J-xy(7dVqGeecxO904KPj_fI=Au{Ukk)dnnDq=afw zI%*^@>@T*syGjJRLd1;0Qiuc4NccD6^%dQKS+y=DLSFC^WAR-juEtMwB6pS`9@SM6 z_|1*Jwp>A!*E)f@v<~Q5hpr|8x;+COX7=Ior#f2%iSWGvA-a+YbB;pO8il}>_%TD! zU_Y?HM0lALzt1aQj1#HvG>DaGsMZcPG_Ny@ID%yonZA*`qa7$ByXY;Tks7YHu+%#r z96yw9M7+-?zdombGZ@A@Lmy4C?J<2R)Cx&adax;Kqxl?4L#w}nk7xAlWnT*2Zj{p; zn`-%0p3&I1|qpoCyf6+)A zfN7Q9;lB`Y6`@%Cq(35n#4;92CL5WOC%+E7g*ISHkMMnBzSHpqM`=k1BGfG6eib_TS6G4#l8Y~ zjVI;iIUfm#oior8jIy_Wh@Z~!(+_NvJ;T!mAJjSwRD!IL3>lHCtr#V3f!x?EQfk#O z`WQXk7V)FXPRjBX&RB#|8{zEXeblAXZy*A)Jv8go^nI`{U$u3bYAMQTGD&p8Mw#f_ z(u-Yojtm?GgC0mNM3cJ><&<@yohECoIZT8N83WP0daF~w> z4jgea^x+Brf#6{JcYm?9-wxLEVvSTtIijP71*#_sZq9C&NBI)<3zc#%dqVV-(u6U7 zf>@X~+*y|}@2OT`jQB5yl%IIV5sadGphQA1TNJD!7 zY$1x7pN}O3Op5t!Xt#TT>7|#38&v$uX9&5_K&@uaKR~DD9M2N_ zL|T_p;yjv%$B;bhAYo=QriQrG)tclQ!}Mu4s%N1y*MYx6Q5y=NVu1 ke)m(}`&XXw)uy~e+c7_!@rx~*z@Fp&UqDh!2KU?r0IJ*qS^xk5 literal 0 Hc$@