##// END OF EJS Templates
Run black on all files that would lead to 3 lines changes or less
Matthias Bussonnier -
Show More
@@ -1,4 +1,4 b''
1 1 # coding: iso-8859-5
2 2 # (Unlikely to be the default encoding for most testers.)
3 3 # ������������������� <- Cyrillic characters
4 u = '����'
4 u = "����"
@@ -1,11 +1,14 b''
1 1 # encoding: utf-8
2 2 from IPython.testing import decorators as dec
3 3
4
4 5 def test_import_backgroundjobs():
5 6 from IPython.lib import backgroundjobs
6 7
8
7 9 def test_import_deepreload():
8 10 from IPython.lib import deepreload
9 11
12
10 13 def test_import_demo():
11 14 from IPython.lib import demo
@@ -1,63 +1,62 b''
1 1 """
2 2 Inputhook for running the original asyncio event loop while we're waiting for
3 3 input.
4 4
5 5 By default, in IPython, we run the prompt with a different asyncio event loop,
6 6 because otherwise we risk that people are freezing the prompt by scheduling bad
7 7 coroutines. E.g., a coroutine that does a while/true and never yield back
8 8 control to the loop. We can't cancel that.
9 9
10 10 However, sometimes we want the asyncio loop to keep running while waiting for
11 11 a prompt.
12 12
13 13 The following example will print the numbers from 1 to 10 above the prompt,
14 14 while we are waiting for input. (This works also because we use
15 15 prompt_toolkit`s `patch_stdout`)::
16 16
17 17 In [1]: import asyncio
18 18
19 19 In [2]: %gui asyncio
20 20
21 21 In [3]: async def f():
22 22 ...: for i in range(10):
23 23 ...: await asyncio.sleep(1)
24 24 ...: print(i)
25 25
26 26
27 27 In [4]: asyncio.ensure_future(f())
28 28
29 29 """
30 30 from prompt_toolkit import __version__ as ptk_version
31 31
32 32 from IPython.core.async_helpers import get_asyncio_loop
33 33
34 PTK3 = ptk_version.startswith('3.')
35
34 PTK3 = ptk_version.startswith("3.")
36 35
37 36
38 37 def inputhook(context):
39 38 """
40 39 Inputhook for asyncio event loop integration.
41 40 """
42 41 # For prompt_toolkit 3.0, this input hook literally doesn't do anything.
43 42 # The event loop integration here is implemented in `interactiveshell.py`
44 43 # by running the prompt itself in the current asyncio loop. The main reason
45 44 # for this is that nesting asyncio event loops is unreliable.
46 45 if PTK3:
47 46 return
48 47
49 48 # For prompt_toolkit 2.0, we can run the current asyncio event loop,
50 49 # because prompt_toolkit 2.0 uses a different event loop internally.
51 50
52 51 # get the persistent asyncio event loop
53 52 loop = get_asyncio_loop()
54 53
55 54 def stop():
56 55 loop.stop()
57 56
58 57 fileno = context.fileno()
59 58 loop.add_reader(fileno, stop)
60 59 try:
61 60 loop.run_forever()
62 61 finally:
63 62 loop.remove_reader(fileno)
@@ -1,58 +1,60 b''
1 1 # Code borrowed from python-prompt-toolkit examples
2 2 # https://github.com/jonathanslenders/python-prompt-toolkit/blob/77cdcfbc7f4b4c34a9d2f9a34d422d7152f16209/examples/inputhook.py
3 3
4 4 # Copyright (c) 2014, Jonathan Slenders
5 5 # All rights reserved.
6 6 #
7 7 # Redistribution and use in source and binary forms, with or without modification,
8 8 # are permitted provided that the following conditions are met:
9 9 #
10 10 # * Redistributions of source code must retain the above copyright notice, this
11 11 # list of conditions and the following disclaimer.
12 12 #
13 13 # * Redistributions in binary form must reproduce the above copyright notice, this
14 14 # list of conditions and the following disclaimer in the documentation and/or
15 15 # other materials provided with the distribution.
16 16 #
17 17 # * Neither the name of the {organization} nor the names of its
18 18 # contributors may be used to endorse or promote products derived from
19 19 # this software without specific prior written permission.
20 20 #
21 21 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22 22 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 23 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 24 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
25 25 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 26 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 27 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
28 28 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 29 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 30 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 31
32 32 """
33 33 PyGTK input hook for prompt_toolkit.
34 34
35 35 Listens on the pipe prompt_toolkit sets up for a notification that it should
36 36 return control to the terminal event loop.
37 37 """
38 38
39 39 import gtk, gobject
40 40
41 41 # Enable threading in GTK. (Otherwise, GTK will keep the GIL.)
42 42 gtk.gdk.threads_init()
43 43
44
44 45 def inputhook(context):
45 46 """
46 47 When the eventloop of prompt-toolkit is idle, call this inputhook.
47 48
48 49 This will run the GTK main loop until the file descriptor
49 50 `context.fileno()` becomes ready.
50 51
51 52 :param context: An `InputHookContext` instance.
52 53 """
54
53 55 def _main_quit(*a, **kw):
54 56 gtk.main_quit()
55 57 return False
56 58
57 59 gobject.io_add_watch(context.fileno(), gobject.IO_IN, _main_quit)
58 60 gtk.main()
@@ -1,12 +1,14 b''
1 1 """prompt_toolkit input hook for GTK 3
2 2 """
3 3
4 4 from gi.repository import Gtk, GLib
5 5
6
6 7 def _main_quit(*args, **kwargs):
7 8 Gtk.main_quit()
8 9 return False
9 10
11
10 12 def inputhook(context):
11 13 GLib.io_add_watch(context.fileno(), GLib.PRIORITY_DEFAULT, GLib.IO_IN, _main_quit)
12 14 Gtk.main()
@@ -1,2 +1,2 b''
1 1 x = 1
2 print('x is:',x)
2 print("x is:", x)
@@ -1,2 +1,2 b''
1 1 # GENERATED BY setup.py
2 commit = u""
2 commit = ""
@@ -1,67 +1,66 b''
1 1 from IPython.utils.dir2 import dir2
2 2
3 3 import pytest
4 4
5 5
6 6 class Base(object):
7 7 x = 1
8 8 z = 23
9 9
10 10
11 11 def test_base():
12 12 res = dir2(Base())
13 13 assert "x" in res
14 14 assert "z" in res
15 15 assert "y" not in res
16 16 assert "__class__" in res
17 17 assert res.count("x") == 1
18 18 assert res.count("__class__") == 1
19 19
20 20
21 21 def test_SubClass():
22
23 22 class SubClass(Base):
24 23 y = 2
25 24
26 25 res = dir2(SubClass())
27 26 assert "y" in res
28 27 assert res.count("y") == 1
29 28 assert res.count("x") == 1
30 29
31 30
32 31 def test_SubClass_with_trait_names_attr():
33 32 # usecase: trait_names is used in a class describing psychological classification
34 33
35 34 class SubClass(Base):
36 35 y = 2
37 36 trait_names = 44
38 37
39 38 res = dir2(SubClass())
40 39 assert "trait_names" in res
41 40
42 41
43 42 def test_misbehaving_object_without_trait_names():
44 43 # dir2 shouldn't raise even when objects are dumb and raise
45 44 # something other than AttribteErrors on bad getattr.
46 45
47 46 class MisbehavingGetattr:
48 47 def __getattr__(self, attr):
49 48 raise KeyError("I should be caught")
50 49
51 50 def some_method(self):
52 51 return True
53 52
54 53 class SillierWithDir(MisbehavingGetattr):
55 54 def __dir__(self):
56 return ['some_method']
55 return ["some_method"]
57 56
58 57 for bad_klass in (MisbehavingGetattr, SillierWithDir):
59 58 obj = bad_klass()
60 59
61 60 assert obj.some_method()
62 61
63 62 with pytest.raises(KeyError):
64 63 obj.other_method()
65 64
66 65 res = dir2(obj)
67 66 assert "some_method" in res
@@ -1,354 +1,354 b''
1 1 # encoding: utf-8
2 2 """
3 3 This module defines the things that are used in setup.py for building IPython
4 4
5 5 This includes:
6 6
7 7 * The basic arguments to setup
8 8 * Functions for finding things like packages, package data, etc.
9 9 * A function for checking dependencies.
10 10 """
11 11
12 12 # Copyright (c) IPython Development Team.
13 13 # Distributed under the terms of the Modified BSD License.
14 14
15 15 import os
16 16 import re
17 17 import sys
18 18 from glob import glob
19 19 from logging import log
20 20
21 21 from setuptools import Command
22 22 from setuptools.command.build_py import build_py
23 23
24 24 from setuptools.command.install import install
25 25 from setuptools.command.install_scripts import install_scripts
26 26
27 27
28 28 #-------------------------------------------------------------------------------
29 29 # Useful globals and utility functions
30 30 #-------------------------------------------------------------------------------
31 31
32 32 # A few handy globals
33 33 isfile = os.path.isfile
34 34 pjoin = os.path.join
35 35 repo_root = os.path.dirname(os.path.abspath(__file__))
36 36
37 37 def execfile(fname, globs, locs=None):
38 38 locs = locs or globs
39 39 with open(fname, encoding="utf-8") as f:
40 40 exec(compile(f.read(), fname, "exec"), globs, locs)
41 41
42 42 # A little utility we'll need below, since glob() does NOT allow you to do
43 43 # exclusion on multiple endings!
44 44 def file_doesnt_endwith(test,endings):
45 45 """Return true if test is a file and its name does NOT end with any
46 46 of the strings listed in endings."""
47 47 if not isfile(test):
48 48 return False
49 49 for e in endings:
50 50 if test.endswith(e):
51 51 return False
52 52 return True
53 53
54 54 #---------------------------------------------------------------------------
55 55 # Basic project information
56 56 #---------------------------------------------------------------------------
57 57
58 58 # release.py contains version, authors, license, url, keywords, etc.
59 59 execfile(pjoin(repo_root, 'IPython','core','release.py'), globals())
60 60
61 61 # Create a dict with the basic information
62 62 # This dict is eventually passed to setup after additional keys are added.
63 63 setup_args = dict(
64 64 author = author,
65 65 author_email = author_email,
66 66 license = license,
67 67 )
68 68
69 69
70 70 #---------------------------------------------------------------------------
71 71 # Find packages
72 72 #---------------------------------------------------------------------------
73 73
74 74 def find_packages():
75 75 """
76 76 Find all of IPython's packages.
77 77 """
78 78 excludes = ['deathrow', 'quarantine']
79 79 packages = []
80 80 for directory, subdirs, files in os.walk("IPython"):
81 81 package = directory.replace(os.path.sep, ".")
82 82 if any(package.startswith("IPython." + exc) for exc in excludes):
83 83 # package is to be excluded (e.g. deathrow)
84 84 continue
85 85 if '__init__.py' not in files:
86 86 # not a package
87 87 continue
88 88 packages.append(package)
89 89 return packages
90 90
91 91 #---------------------------------------------------------------------------
92 92 # Find package data
93 93 #---------------------------------------------------------------------------
94 94
95 95 def find_package_data():
96 96 """
97 97 Find IPython's package_data.
98 98 """
99 99 # This is not enough for these things to appear in an sdist.
100 100 # We need to muck with the MANIFEST to get this to work
101 101
102 102 package_data = {
103 103 'IPython.core' : ['profile/README*'],
104 104 'IPython.core.tests' : ['*.png', '*.jpg', 'daft_extension/*.py'],
105 105 'IPython.lib.tests' : ['*.wav'],
106 106 'IPython.testing.plugin' : ['*.txt'],
107 107 }
108 108
109 109 return package_data
110 110
111 111
112 112 def check_package_data(package_data):
113 113 """verify that package_data globs make sense"""
114 114 print("checking package data")
115 115 for pkg, data in package_data.items():
116 116 pkg_root = pjoin(*pkg.split('.'))
117 117 for d in data:
118 118 path = pjoin(pkg_root, d)
119 119 if '*' in path:
120 120 assert len(glob(path)) > 0, "No files match pattern %s" % path
121 121 else:
122 122 assert os.path.exists(path), "Missing package data: %s" % path
123 123
124 124
125 125 def check_package_data_first(command):
126 126 """decorator for checking package_data before running a given command
127 127
128 128 Probably only needs to wrap build_py
129 129 """
130 130 class DecoratedCommand(command):
131 131 def run(self):
132 132 check_package_data(self.package_data)
133 133 command.run(self)
134 134 return DecoratedCommand
135 135
136 136
137 137 #---------------------------------------------------------------------------
138 138 # Find data files
139 139 #---------------------------------------------------------------------------
140 140
141 141 def find_data_files():
142 142 """
143 143 Find IPython's data_files.
144 144
145 145 Just man pages at this point.
146 146 """
147 147
148 148 if "freebsd" in sys.platform:
149 149 manpagebase = pjoin('man', 'man1')
150 150 else:
151 151 manpagebase = pjoin('share', 'man', 'man1')
152 152
153 153 # Simple file lists can be made by hand
154 154 manpages = [f for f in glob(pjoin('docs','man','*.1.gz')) if isfile(f)]
155 155 if not manpages:
156 156 # When running from a source tree, the manpages aren't gzipped
157 157 manpages = [f for f in glob(pjoin('docs','man','*.1')) if isfile(f)]
158 158
159 159 # And assemble the entire output list
160 160 data_files = [ (manpagebase, manpages) ]
161 161
162 162 return data_files
163 163
164 164
165 165 # The two functions below are copied from IPython.utils.path, so we don't need
166 166 # to import IPython during setup, which fails on Python 3.
167 167
168 168 def target_outdated(target,deps):
169 169 """Determine whether a target is out of date.
170 170
171 171 target_outdated(target,deps) -> 1/0
172 172
173 173 deps: list of filenames which MUST exist.
174 174 target: single filename which may or may not exist.
175 175
176 176 If target doesn't exist or is older than any file listed in deps, return
177 177 true, otherwise return false.
178 178 """
179 179 try:
180 180 target_time = os.path.getmtime(target)
181 181 except os.error:
182 182 return 1
183 183 for dep in deps:
184 184 dep_time = os.path.getmtime(dep)
185 185 if dep_time > target_time:
186 186 #print "For target",target,"Dep failed:",dep # dbg
187 187 #print "times (dep,tar):",dep_time,target_time # dbg
188 188 return 1
189 189 return 0
190 190
191 191
192 192 def target_update(target,deps,cmd):
193 193 """Update a target with a given command given a list of dependencies.
194 194
195 195 target_update(target,deps,cmd) -> runs cmd if target is outdated.
196 196
197 197 This is just a wrapper around target_outdated() which calls the given
198 198 command if target is outdated."""
199 199
200 200 if target_outdated(target,deps):
201 201 os.system(cmd)
202 202
203 203 #---------------------------------------------------------------------------
204 204 # Find scripts
205 205 #---------------------------------------------------------------------------
206 206
207 207 def find_entry_points():
208 208 """Defines the command line entry points for IPython
209 209
210 210 This always uses setuptools-style entry points. When setuptools is not in
211 211 use, our own build_scripts_entrypt class below parses these and builds
212 212 command line scripts.
213 213
214 214 Each of our entry points gets a plain name, e.g. ipython, a name
215 215 suffixed with the Python major version number, e.g. ipython3, and
216 216 a name suffixed with the Python major.minor version number, eg. ipython3.8.
217 217 """
218 218 ep = [
219 219 'ipython%s = IPython:start_ipython',
220 220 ]
221 221 major_suffix = str(sys.version_info[0])
222 222 minor_suffix = ".".join([str(sys.version_info[0]), str(sys.version_info[1])])
223 223 return (
224 224 [e % "" for e in ep]
225 225 + [e % major_suffix for e in ep]
226 226 + [e % minor_suffix for e in ep]
227 227 )
228 228
229 229 class install_lib_symlink(Command):
230 230 user_options = [
231 231 ('install-dir=', 'd', "directory to install to"),
232 232 ]
233 233
234 234 def initialize_options(self):
235 235 self.install_dir = None
236 236
237 237 def finalize_options(self):
238 238 self.set_undefined_options('symlink',
239 239 ('install_lib', 'install_dir'),
240 240 )
241 241
242 242 def run(self):
243 243 if sys.platform == 'win32':
244 244 raise Exception("This doesn't work on Windows.")
245 245 pkg = os.path.join(os.getcwd(), 'IPython')
246 246 dest = os.path.join(self.install_dir, 'IPython')
247 247 if os.path.islink(dest):
248 248 print('removing existing symlink at %s' % dest)
249 249 os.unlink(dest)
250 250 print('symlinking %s -> %s' % (pkg, dest))
251 251 os.symlink(pkg, dest)
252 252
253 253 class unsymlink(install):
254 254 def run(self):
255 255 dest = os.path.join(self.install_lib, 'IPython')
256 256 if os.path.islink(dest):
257 257 print('removing symlink at %s' % dest)
258 258 os.unlink(dest)
259 259 else:
260 260 print('No symlink exists at %s' % dest)
261 261
262 262 class install_symlinked(install):
263 263 def run(self):
264 264 if sys.platform == 'win32':
265 265 raise Exception("This doesn't work on Windows.")
266 266
267 267 # Run all sub-commands (at least those that need to be run)
268 268 for cmd_name in self.get_sub_commands():
269 269 self.run_command(cmd_name)
270 270
271 271 # 'sub_commands': a list of commands this command might have to run to
272 272 # get its work done. See cmd.py for more info.
273 273 sub_commands = [('install_lib_symlink', lambda self:True),
274 274 ('install_scripts_sym', lambda self:True),
275 275 ]
276 276
277 277 class install_scripts_for_symlink(install_scripts):
278 278 """Redefined to get options from 'symlink' instead of 'install'.
279 279
280 280 I love distutils almost as much as I love setuptools.
281 281 """
282 282 def finalize_options(self):
283 283 self.set_undefined_options('build', ('build_scripts', 'build_dir'))
284 284 self.set_undefined_options('symlink',
285 285 ('install_scripts', 'install_dir'),
286 286 ('force', 'force'),
287 287 ('skip_build', 'skip_build'),
288 288 )
289 289
290 290
291 291 #---------------------------------------------------------------------------
292 292 # VCS related
293 293 #---------------------------------------------------------------------------
294 294
295 295
296 296 def git_prebuild(pkg_dir, build_cmd=build_py):
297 297 """Return extended build or sdist command class for recording commit
298 298
299 299 records git commit in IPython.utils._sysinfo.commit
300 300
301 301 for use in IPython.utils.sysinfo.sys_info() calls after installation.
302 302 """
303 303
304 304 class MyBuildPy(build_cmd):
305 305 ''' Subclass to write commit data into installation tree '''
306 306 def run(self):
307 307 # loose as `.dev` is suppose to be invalid
308 308 print("check version number")
309 309 loose_pep440re = re.compile(r'^(\d+)\.(\d+)\.(\d+((a|b|rc)\d+)?)(\.post\d+)?(\.dev\d*)?$')
310 310 if not loose_pep440re.match(version):
311 311 raise ValueError("Version number '%s' is not valid (should match [N!]N(.N)*[{a|b|rc}N][.postN][.devN])" % version)
312 312
313 313
314 314 build_cmd.run(self)
315 315 # this one will only fire for build commands
316 316 if hasattr(self, 'build_lib'):
317 317 self._record_commit(self.build_lib)
318 318
319 319 def make_release_tree(self, base_dir, files):
320 320 # this one will fire for sdist
321 321 build_cmd.make_release_tree(self, base_dir, files)
322 322 self._record_commit(base_dir)
323 323
324 324 def _record_commit(self, base_dir):
325 325 import subprocess
326 326 proc = subprocess.Popen('git rev-parse --short HEAD',
327 327 stdout=subprocess.PIPE,
328 328 stderr=subprocess.PIPE,
329 329 shell=True)
330 330 repo_commit, _ = proc.communicate()
331 331 repo_commit = repo_commit.strip().decode("ascii")
332 332
333 333 out_pth = pjoin(base_dir, pkg_dir, 'utils', '_sysinfo.py')
334 334 if os.path.isfile(out_pth) and not repo_commit:
335 335 # nothing to write, don't clobber
336 336 return
337 337
338 338 print("writing git commit '%s' to %s" % (repo_commit, out_pth))
339 339
340 340 # remove to avoid overwriting original via hard link
341 341 try:
342 342 os.remove(out_pth)
343 343 except (IOError, OSError):
344 344 pass
345 345 with open(out_pth, "w", encoding="utf-8") as out_file:
346 346 out_file.writelines(
347 347 [
348 348 "# GENERATED BY setup.py\n",
349 'commit = u"%s"\n' % repo_commit,
349 'commit = "%s"\n' % repo_commit,
350 350 ]
351 351 )
352 352
353 353 return MyBuildPy
354 354
General Comments 0
You need to be logged in to leave comments. Login now