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.