##// END OF EJS Templates
simplified copy_files logic
Paul Ivanov -
Show More
@@ -1,143 +1,139 b''
1 1 """
2 2 Contains base test class for nbconvert
3 3 """
4 4 #-----------------------------------------------------------------------------
5 5 #Copyright (c) 2013, the IPython Development Team.
6 6 #
7 7 #Distributed under the terms of the Modified BSD License.
8 8 #
9 9 #The full license is in the file COPYING.txt, distributed with this software.
10 10 #-----------------------------------------------------------------------------
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Imports
14 14 #-----------------------------------------------------------------------------
15 15
16 16 import os
17 17 import glob
18 18 import shutil
19 19
20 20 import IPython
21 21 from IPython.utils.tempdir import TemporaryWorkingDirectory
22 22 from IPython.utils.process import get_output_error_code
23 23 from IPython.testing.tools import get_ipython_cmd
24 24
25 25 # a trailing space allows for simpler concatenation with the other arguments
26 26 ipy_cmd = get_ipython_cmd(as_string=True) + " "
27 27
28 28 #-----------------------------------------------------------------------------
29 29 # Classes and functions
30 30 #-----------------------------------------------------------------------------
31 31
32 32
33 33 class TestsBase(object):
34 34 """Base tests class. Contains usefull fuzzy comparison and nbconvert
35 35 functions."""
36 36
37 37
38 38 def fuzzy_compare(self, a, b, newlines_are_spaces=True, tabs_are_spaces=True,
39 39 fuzzy_spacing=True, ignore_spaces=False,
40 40 ignore_newlines=False, case_sensitive=False):
41 41 """
42 42 Performs a fuzzy comparison of two strings. A fuzzy comparison is a
43 43 comparison that ignores insignificant differences in the two comparands.
44 44 The significance of certain differences can be specified via the keyword
45 45 parameters of this method.
46 46 """
47 47
48 48 if newlines_are_spaces:
49 49 a = a.replace('\n', ' ')
50 50 b = b.replace('\n', ' ')
51 51
52 52 if tabs_are_spaces:
53 53 a = a.replace('\t', ' ')
54 54 b = b.replace('\t', ' ')
55 55
56 56 if ignore_spaces:
57 57 a = a.replace(' ', '')
58 58 b = b.replace(' ', '')
59 59
60 60 if fuzzy_spacing:
61 61 a = self.recursive_replace(a, ' ', ' ')
62 62 b = self.recursive_replace(b, ' ', ' ')
63 63
64 64 if ignore_newlines:
65 65 a = a.replace('\n', '')
66 66 b = b.replace('\n', '')
67 67
68 68 if not case_sensitive:
69 69 a = a.lower()
70 70 b = b.lower()
71 71
72 72 return a == b
73 73
74 74
75 75 def recursive_replace(self, text, search, replacement):
76 76 """
77 77 Performs a recursive replacement operation. Replaces all instances
78 78 of a search string in a text string with a replacement string until
79 79 the search string no longer exists. Recursion is needed because the
80 80 replacement string may generate additional search strings.
81 81
82 82 For example:
83 83 Replace "ii" with "i" in the string "Hiiii" yields "Hii"
84 84 Another replacement yields "Hi" (the desired output)
85 85
86 86 Parameters:
87 87 -----------
88 88 text : string
89 89 Text to replace in.
90 90 search : string
91 91 String to search for within "text"
92 92 replacement : string
93 93 String to replace "search" with
94 94 """
95 95 while search in text:
96 96 text = text.replace(search, replacement)
97 97 return text
98 98
99 99
100 100 def create_temp_cwd(self, copy_filenames=None):
101 101 temp_dir = TemporaryWorkingDirectory()
102 102
103 103 #Copy the files if requested.
104 104 if not copy_filenames is None:
105 105 self.copy_files_to(copy_filenames)
106 106
107 107 #Return directory handler
108 108 return temp_dir
109 109
110 110
111 def copy_files_to(self, copy_filenames=None, destination=None):
112
113 #Copy test files into the destination directory.
114 if copy_filenames:
111 def copy_files_to(self, copy_filenames, dest='.'):
112 "Copy test files into the destination directory"
113 if not os.path.isdir(dest):
114 os.makedirs(dest)
115 files_path = self._get_files_path()
115 116 for pattern in copy_filenames:
116 for match in glob.glob(os.path.join(self._get_files_path(), pattern)):
117 if destination is None:
118 shutil.copyfile(match, os.path.basename(match))
119 else:
120 if not os.path.isdir(destination):
121 os.makedirs(destination)
122 shutil.copyfile(match, os.path.join(destination, os.path.basename(match)))
117 for match in glob.glob(os.path.join(files_path, pattern)):
118 shutil.copyfile(match, os.path.join(dest, os.path.basename(match)))
123 119
124 120
125 121 def _get_files_path(self):
126 122
127 123 #Get the relative path to this module in the IPython directory.
128 124 names = self.__module__.split('.')[1:-1]
129 125 names.append('files')
130 126
131 127 #Build a path using the IPython directory and the relative path we just
132 128 #found.
133 129 path = IPython.__path__[0]
134 130 for name in names:
135 131 path = os.path.join(path, name)
136 132 return path
137 133
138 134
139 135 def call(self, parameters, raise_on_error=True):
140 136 stdout, stderr, retcode = get_output_error_code(ipy_cmd + parameters)
141 137 if retcode != 0 and raise_on_error:
142 138 raise OSError(stderr)
143 139 return stdout, stderr
General Comments 0
You need to be logged in to leave comments. Login now