Mercurial > hg
comparison tests/test-extension.t @ 33531:9cbbf9118c6c
demandimport: prefer loaded module over package attribute (issue5617)
In general, the attribute of the same name is overwritten by executing an
import statement.
import a.b
print(a.b.c) # 'c' of a/b/__init__.py
from a.b.c import d
print(a.b.c) # a/b/c.py
However, this appears not true for the scenario described in the test case,
and surprisingly, "from a.b.c import d" works even if "a.b.c" is not a module.
This patch works around the problem by taking the right module from sys.modules
if available.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 16 Jul 2017 17:38:39 +0900 |
parents | ded3ebae8779 |
children | 23f999211940 24849d53697d |
comparison
equal
deleted
inserted
replaced
33530:05e3fa254b6b | 33531:9cbbf9118c6c |
---|---|
333 | 333 |
334 $ cat > $TESTTMP/extlibroot/recursedown/__init__.py <<EOF | 334 $ cat > $TESTTMP/extlibroot/recursedown/__init__.py <<EOF |
335 > from __future__ import absolute_import | 335 > from __future__ import absolute_import |
336 > from extlibroot.recursedown.abs import detail as absdetail | 336 > from extlibroot.recursedown.abs import detail as absdetail |
337 > from .legacy import detail as legacydetail | 337 > from .legacy import detail as legacydetail |
338 > EOF | |
339 | |
340 Setup package that re-exports an attribute of its submodule as the same | |
341 name. This leaves 'shadowing.used' pointing to 'used.detail', but still | |
342 the submodule 'used' should be somehow accessible. (issue5617) | |
343 | |
344 $ mkdir -p $TESTTMP/extlibroot/shadowing | |
345 $ cat > $TESTTMP/extlibroot/shadowing/used.py <<EOF | |
346 > detail = "this is extlibroot.shadowing.used" | |
347 > EOF | |
348 $ cat > $TESTTMP/extlibroot/shadowing/proxied.py <<EOF | |
349 > from __future__ import absolute_import | |
350 > from extlibroot.shadowing.used import detail | |
351 > EOF | |
352 $ cat > $TESTTMP/extlibroot/shadowing/__init__.py <<EOF | |
353 > from __future__ import absolute_import | |
354 > from .used import detail as used | |
338 > EOF | 355 > EOF |
339 | 356 |
340 Setup extension local modules to be imported with "absolute_import" | 357 Setup extension local modules to be imported with "absolute_import" |
341 feature. | 358 feature. |
342 | 359 |
427 > | 444 > |
428 > # import modules from external library | 445 > # import modules from external library |
429 > from extlibroot.lsub1.lsub2 import used as lused, unused as lunused | 446 > from extlibroot.lsub1.lsub2 import used as lused, unused as lunused |
430 > from extlibroot.lsub1.lsub2.called import func as lfunc | 447 > from extlibroot.lsub1.lsub2.called import func as lfunc |
431 > from extlibroot.recursedown import absdetail, legacydetail | 448 > from extlibroot.recursedown import absdetail, legacydetail |
449 > from extlibroot.shadowing import proxied | |
432 > | 450 > |
433 > def uisetup(ui): | 451 > def uisetup(ui): |
434 > result = [] | 452 > result = [] |
435 > result.append(lused.detail) | 453 > result.append(lused.detail) |
436 > result.append(lfunc()) | 454 > result.append(lfunc()) |
437 > result.append(absdetail) | 455 > result.append(absdetail) |
438 > result.append(legacydetail) | 456 > result.append(legacydetail) |
457 > result.append(proxied.detail) | |
439 > ui.write('LIB: %s\n' % '\nLIB: '.join(result)) | 458 > ui.write('LIB: %s\n' % '\nLIB: '.join(result)) |
440 > EOF | 459 > EOF |
441 | 460 |
442 Examine module importing. | 461 Examine module importing. |
443 | 462 |
444 $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}; hg --config extensions.absextroot=$TESTTMP/absextroot showabsolute) | 463 $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}; hg --config extensions.absextroot=$TESTTMP/absextroot showabsolute) |
445 LIB: this is extlibroot.lsub1.lsub2.used | 464 LIB: this is extlibroot.lsub1.lsub2.used |
446 LIB: this is extlibroot.lsub1.lsub2.called.func() | 465 LIB: this is extlibroot.lsub1.lsub2.called.func() |
447 LIB: this is extlibroot.recursedown.abs.used | 466 LIB: this is extlibroot.recursedown.abs.used |
448 LIB: this is extlibroot.recursedown.legacy.used | 467 LIB: this is extlibroot.recursedown.legacy.used |
468 LIB: this is extlibroot.shadowing.used | |
449 ABS: this is absextroot.xsub1.xsub2.used | 469 ABS: this is absextroot.xsub1.xsub2.used |
450 ABS: this is absextroot.xsub1.xsub2.called.func() | 470 ABS: this is absextroot.xsub1.xsub2.called.func() |
451 | 471 |
452 $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}; hg --config extensions.absextroot=$TESTTMP/absextroot showrelative) | 472 $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}; hg --config extensions.absextroot=$TESTTMP/absextroot showrelative) |
453 LIB: this is extlibroot.lsub1.lsub2.used | 473 LIB: this is extlibroot.lsub1.lsub2.used |
454 LIB: this is extlibroot.lsub1.lsub2.called.func() | 474 LIB: this is extlibroot.lsub1.lsub2.called.func() |
455 LIB: this is extlibroot.recursedown.abs.used | 475 LIB: this is extlibroot.recursedown.abs.used |
456 LIB: this is extlibroot.recursedown.legacy.used | 476 LIB: this is extlibroot.recursedown.legacy.used |
477 LIB: this is extlibroot.shadowing.used | |
457 REL: this is absextroot.xsub1.xsub2.used | 478 REL: this is absextroot.xsub1.xsub2.used |
458 REL: this is absextroot.xsub1.xsub2.called.func() | 479 REL: this is absextroot.xsub1.xsub2.called.func() |
459 REL: this relimporter imports 'this is absextroot.relimportee' | 480 REL: this relimporter imports 'this is absextroot.relimportee' |
460 | 481 |
461 Examine whether sub-module is imported relatively as expected. | 482 Examine whether sub-module is imported relatively as expected. |