Mercurial > hg
annotate hgdemandimport/demandimportpy3.py @ 46427:6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
This avoids allocating intermediate strings.
Differential Revision: https://phab.mercurial-scm.org/D9860
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 25 Jan 2021 12:00:23 +0100 |
parents | 8ed69bd42f10 |
children | 6000f5b25c9b |
rev | line source |
---|---|
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
1 # demandimportpy3 - global demand-loading of modules for Mercurial |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
2 # |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
3 # Copyright 2017 Facebook Inc. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
4 # |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
7 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
8 """Lazy loading for Python 3.6 and above. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
9 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
10 This uses the new importlib finder/loader functionality available in Python 3.5 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
11 and up. The code reuses most of the mechanics implemented inside importlib.util, |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
12 but with a few additions: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
13 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
14 * Allow excluding certain modules from lazy imports. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
15 * Expose an interface that's substantially the same as demandimport for |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
16 Python 2. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
17 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
18 This also has some limitations compared to the Python 2 implementation: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
19 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
20 * Much of the logic is per-package, not per-module, so any packages loaded |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
21 before demandimport is enabled will not be lazily imported in the future. In |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
22 practice, we only expect builtins to be loaded before demandimport is |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
23 enabled. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
24 """ |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
25 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
26 # This line is unnecessary, but it satisfies test-check-py3-compat.t. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
27 from __future__ import absolute_import |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
28 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
29 import contextlib |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
30 import importlib.util |
33898
3595e4e0ae57
demandimportpy3: update to pass import checker
Augie Fackler <raf@durin42.com>
parents:
33859
diff
changeset
|
31 import sys |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
32 |
42474
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
33 from . import tracing |
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
34 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
35 _deactivated = False |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
36 |
44117
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
37 # Python 3.5's LazyLoader doesn't work for some reason. |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
38 # https://bugs.python.org/issue26186 is a known issue with extension |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
39 # importing. But it appears to not have a meaningful effect with |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
40 # Mercurial. |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
41 _supported = sys.version_info[0:2] >= (3, 6) |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
42 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
43 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
44 class _lazyloaderex(importlib.util.LazyLoader): |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
45 """This is a LazyLoader except it also follows the _deactivated global and |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
46 the ignore list. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
47 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
48 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
49 def exec_module(self, module): |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
50 """Make the module load lazily.""" |
42474
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
51 with tracing.log('demandimport %s', module): |
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
52 if _deactivated or module.__name__ in ignores: |
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
53 self.loader.exec_module(module) |
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
54 else: |
adb636392b3f
demandimport: add tracing coverage for Python 3
Augie Fackler <augie@google.com>
parents:
37843
diff
changeset
|
55 super().exec_module(module) |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
56 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
57 |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
58 class LazyFinder(object): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
59 """A wrapper around a ``MetaPathFinder`` that makes loaders lazy. |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
60 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
61 ``sys.meta_path`` finders have their ``find_spec()`` called to locate a |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
62 module. This returns a ``ModuleSpec`` if found or ``None``. The |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
63 ``ModuleSpec`` has a ``loader`` attribute, which is called to actually |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
64 load a module. |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
65 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
66 Our class wraps an existing finder and overloads its ``find_spec()`` to |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
67 replace the ``loader`` with our lazy loader proxy. |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
68 |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
69 We have to use __getattribute__ to proxy the instance because some meta |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
70 path finders don't support monkeypatching. |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
71 """ |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
72 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
73 __slots__ = ("_finder",) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
74 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
75 def __init__(self, finder): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
76 object.__setattr__(self, "_finder", finder) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
77 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
78 def __repr__(self): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
79 return "<LazyFinder for %r>" % object.__getattribute__(self, "_finder") |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
80 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
81 # __bool__ is canonical Python 3. But check-code insists on __nonzero__ being |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
82 # defined via `def`. |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
83 def __nonzero__(self): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
84 return bool(object.__getattribute__(self, "_finder")) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
85 |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
86 __bool__ = __nonzero__ |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
87 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
88 def __getattribute__(self, name): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
89 if name in ("_finder", "find_spec"): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
90 return object.__getattribute__(self, name) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
91 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
92 return getattr(object.__getattribute__(self, "_finder"), name) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
93 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
94 def __delattr__(self, name): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
95 return delattr(object.__getattribute__(self, "_finder")) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
96 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
97 def __setattr__(self, name, value): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
98 return setattr(object.__getattribute__(self, "_finder"), name, value) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
99 |
44819
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
100 def find_spec(self, fullname, path, target=None): |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
101 finder = object.__getattribute__(self, "_finder") |
44819
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
102 try: |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
103 find_spec = finder.find_spec |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
104 except AttributeError: |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
105 loader = finder.find_module(fullname, path) |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
106 if loader is None: |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
107 spec = None |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
108 else: |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
109 spec = importlib.util.spec_from_loader(fullname, loader) |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
110 else: |
a6e12d477595
demandimport: fix compatibility with meta path finders w/o find_spec() method
Manuel Jacob <me@manueljacob.de>
parents:
44118
diff
changeset
|
111 spec = find_spec(fullname, path, target) |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
112 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
113 # Lazy loader requires exec_module(). |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
114 if ( |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
115 spec is not None |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
116 and spec.loader is not None |
45755
8ed69bd42f10
demandimport: don't raise AttributeError if `exec_module` is missing
Matt Harbison <matt_harbison@yahoo.com>
parents:
44819
diff
changeset
|
117 and getattr(spec.loader, "exec_module", None) |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
118 ): |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
119 spec.loader = _lazyloaderex(spec.loader) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
120 |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
121 return spec |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
122 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
123 |
37843
670eb4fa1b86
demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35524
diff
changeset
|
124 ignores = set() |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
125 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
126 |
37843
670eb4fa1b86
demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35524
diff
changeset
|
127 def init(ignoreset): |
670eb4fa1b86
demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35524
diff
changeset
|
128 global ignores |
670eb4fa1b86
demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35524
diff
changeset
|
129 ignores = ignoreset |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
130 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
131 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
132 def isenabled(): |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
133 return not _deactivated and any( |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
134 isinstance(finder, LazyFinder) for finder in sys.meta_path |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
135 ) |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
136 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
137 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
138 def disable(): |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
139 new_finders = [] |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
140 for finder in sys.meta_path: |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
141 new_finders.append( |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
142 finder._finder if isinstance(finder, LazyFinder) else finder |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
143 ) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
144 sys.meta_path[:] = new_finders |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
145 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
146 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
147 def enable(): |
44117
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
148 if not _supported: |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
149 return |
c5e0a9b97b8a
hgdemandimport: disable on Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43378
diff
changeset
|
150 |
44118
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
151 new_finders = [] |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
152 for finder in sys.meta_path: |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
153 new_finders.append( |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
154 LazyFinder(finder) if not isinstance(finder, LazyFinder) else finder |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
155 ) |
f81c17ec303c
hgdemandimport: apply lazy module loading to sys.meta_path finders
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44117
diff
changeset
|
156 sys.meta_path[:] = new_finders |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
157 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42474
diff
changeset
|
158 |
32423
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
159 @contextlib.contextmanager |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
160 def deactivated(): |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
161 # This implementation is a bit different from Python 2's. Python 3 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
162 # maintains a per-package finder cache in sys.path_importer_cache (see |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
163 # PEP 302). This means that we can't just call disable + enable. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
164 # If we do that, in situations like: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
165 # |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
166 # demandimport.enable() |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
167 # ... |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
168 # from foo.bar import mod1 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
169 # with demandimport.deactivated(): |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
170 # from foo.bar import mod2 |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
171 # |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
172 # mod2 will be imported lazily. (The converse also holds -- whatever finder |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
173 # first gets cached will be used.) |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
174 # |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
175 # Instead, have a global flag the LazyLoader can use. |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
176 global _deactivated |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
177 demandenabled = isenabled() |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
178 if demandenabled: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
179 _deactivated = True |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
180 try: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
181 yield |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
182 finally: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
183 if demandenabled: |
859496bb6db3
demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
184 _deactivated = False |