##// END OF EJS Templates
capture rich output as well as stdout/err in capture_output...
capture rich output as well as stdout/err in capture_output closes #3742

File last commit:

r12134:c98e402d
r12223:e10d2ee4
Show More
base.py
155 lines | 5.0 KiB | text/x-python | PythonLexer
Jonathan Frederic
Added tests directory
r11477 """
Contains base test class for nbconvert
"""
#-----------------------------------------------------------------------------
#Copyright (c) 2013, the IPython Development Team.
#
#Distributed under the terms of the Modified BSD License.
#
#The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Jonathan Frederic
Added test files, and basic tests
r11478 import os
import glob
import shutil
import IPython
Paul Ivanov
moved TemporaryWorkingDir into utils.tempdir
r11873 from IPython.utils.tempdir import TemporaryWorkingDirectory
Paul Ivanov
updated tests to use get_output_error_code
r11828 from IPython.utils.process import get_output_error_code
Paul Ivanov
use new get_ipython_cmd functionality
r11862 from IPython.testing.tools import get_ipython_cmd
Jonathan Frederic
Use IPython parameterized testing
r11936 from IPython.testing.ipunittest import ParametricTestCase
Paul Ivanov
move ipython command line logic to one place...
r11834
Paul Ivanov
use new get_ipython_cmd functionality
r11862 # a trailing space allows for simpler concatenation with the other arguments
ipy_cmd = get_ipython_cmd(as_string=True) + " "
Jonathan Frederic
Added tests directory
r11477
#-----------------------------------------------------------------------------
# Classes and functions
#-----------------------------------------------------------------------------
Jonathan Frederic
Added test files, and basic tests
r11478
Jonathan Frederic
Use IPython parameterized testing
r11936 class TestsBase(ParametricTestCase):
Paul Ivanov
minor typos
r11878 """Base tests class. Contains useful fuzzy comparison and nbconvert
Jonathan Frederic
Added tests directory
r11477 functions."""
def fuzzy_compare(self, a, b, newlines_are_spaces=True, tabs_are_spaces=True,
fuzzy_spacing=True, ignore_spaces=False,
Jonathan Frederic
Add leave_padding option to fuzzy compare
r11905 ignore_newlines=False, case_sensitive=False, leave_padding=False):
Jonathan Frederic
Added tests directory
r11477 """
Performs a fuzzy comparison of two strings. A fuzzy comparison is a
comparison that ignores insignificant differences in the two comparands.
The significance of certain differences can be specified via the keyword
parameters of this method.
"""
Jonathan Frederic
Add leave_padding option to fuzzy compare
r11905 if not leave_padding:
a = a.strip()
b = b.strip()
Jonathan Frederic
Fix fuzzy compare logic
r11904 if ignore_newlines:
a = a.replace('\n', '')
b = b.replace('\n', '')
Jonathan Frederic
Added tests directory
r11477 if newlines_are_spaces:
a = a.replace('\n', ' ')
b = b.replace('\n', ' ')
if tabs_are_spaces:
a = a.replace('\t', ' ')
b = b.replace('\t', ' ')
if ignore_spaces:
a = a.replace(' ', '')
b = b.replace(' ', '')
if fuzzy_spacing:
a = self.recursive_replace(a, ' ', ' ')
b = self.recursive_replace(b, ' ', ' ')
Jonathan Frederic
ignore_case->case_sensitive (boolean opposite)
r11482 if not case_sensitive:
Jonathan Frederic
Added tests directory
r11477 a = a.lower()
b = b.lower()
Jonathan Frederic
Fix assert_equal ref
r11910
Jonathan Frederic
Use IPython parameterized testing
r11936 self.assertEqual(a, b)
Jonathan Frederic
Added tests directory
r11477
def recursive_replace(self, text, search, replacement):
"""
Performs a recursive replacement operation. Replaces all instances
of a search string in a text string with a replacement string until
the search string no longer exists. Recursion is needed because the
replacement string may generate additional search strings.
For example:
Replace "ii" with "i" in the string "Hiiii" yields "Hii"
Another replacement yields "Hi" (the desired output)
Parameters:
-----------
text : string
Text to replace in.
search : string
String to search for within "text"
replacement : string
String to replace "search" with
"""
while search in text:
text = text.replace(search, replacement)
return text
Jonathan Frederic
Added test files, and basic tests
r11478
def create_temp_cwd(self, copy_filenames=None):
temp_dir = TemporaryWorkingDirectory()
#Copy the files if requested.
Paul Ivanov
minor typos
r11878 if copy_filenames is not None:
Jonathan Frederic
Added test files, and basic tests
r11478 self.copy_files_to(copy_filenames)
#Return directory handler
return temp_dir
Paul Ivanov
simplified copy_files logic
r11877 def copy_files_to(self, copy_filenames, dest='.'):
"Copy test files into the destination directory"
if not os.path.isdir(dest):
os.makedirs(dest)
files_path = self._get_files_path()
for pattern in copy_filenames:
for match in glob.glob(os.path.join(files_path, pattern)):
shutil.copyfile(match, os.path.join(dest, os.path.basename(match)))
Jonathan Frederic
Added test files, and basic tests
r11478
def _get_files_path(self):
Jonathan Frederic
Now uses relative path to find files
r11479
#Get the relative path to this module in the IPython directory.
names = self.__module__.split('.')[1:-1]
names.append('files')
#Build a path using the IPython directory and the relative path we just
#found.
path = IPython.__path__[0]
for name in names:
path = os.path.join(path, name)
return path
Jonathan Frederic
Added test files, and basic tests
r11478
Jonathan Frederic
Further refinement
r12133 def call(self, parameters, ignore_return_code=False):
"""
Execute a, IPython shell command, listening for both Errors and non-zero
return codes.
PARAMETERS:
-----------
parameters : str
List of parameters to pass to IPython.
ignore_return_code : optional bool (default False)
Throw an OSError if the return code
"""
Paul Ivanov
move ipython command line logic to one place...
r11834 stdout, stderr, retcode = get_output_error_code(ipy_cmd + parameters)
Jonathan Frederic
"not (x or y)" reads as "neither x nor y"...
r12134 if not (retcode == 0 or ignore_return_code):
Paul Ivanov
updated tests to use get_output_error_code
r11828 raise OSError(stderr)
return stdout, stderr