[PATCH] demandimport: honor absolute_import (issue4029)

Jason R. Coombs jaraco at jaraco.com
Sat Sep 7 20:36:19 UTC 2013


I've followed up with
http://selenic.com/pipermail/mercurial-devel/2013-September/053411.html
(which just includes the unit test).

> -----Original Message-----
> From: Jason R. Coombs
> Sent: Saturday, 07 September, 2013 16:23
> To: 'FUJIWARA Katsunori'
> Cc: mercurial-devel at selenic.com
> Subject: RE: [PATCH] demandimport: honor absolute_import (issue4029)
> 
> I concur. Fujiwara's approach is superior. I hadn't considered that the
level
> attribute could be made available to the demand_mod. Nice work.
> 
> I do believe the unit test provided still holds value (and also does
further
> prove that Fujiwara's fix works). I would prefer to keep the unit test
> included in this patch because it tests the demandimport functionality
more
> directly and without invoking other mercurial machinery (tests in
isolation).
> 
> I withdraw this patch and I will create a separate patch request for just
the
> unit test.
> 
> > -----Original Message-----
> > From: FUJIWARA Katsunori [mailto:foozy at lares.dti.ne.jp]
> > Sent: Saturday, 07 September, 2013 14:35
> > To: Jason R. Coombs
> > Cc: mercurial-devel at selenic.com
> > Subject: Re: [PATCH] demandimport: honor absolute_import (issue4029)
> >
> > I also posted the patch fixing this issue in another way.
> >
> >     http://selenic.com/pipermail/mercurial-devel/2013-
> > September/053405.html
> >
> > IMHO, saving and reusing "level" of original import request seems to be
> > cheaper than checking existence of 'absolute_import' in "locals".
> >
> > At Sat, 7 Sep 2013 01:48:02 +0000,
> > Jason R. Coombs wrote:
> > >
> > > # HG changeset patch
> > > # User Jason R. Coombs <jaraco at jaraco.com> # Date 1378518380 14400
> > > #      Fri Sep 06 21:46:20 2013 -0400
> > > # Node ID 6b00771ea6ce22dc3dda8b6da063d3112bfcbce8
> > > # Parent  1d07bf106c2ad1c7ef5e257e754ca8d858bd04b0
> > > demandimport: honor absolute_import (issue4029)
> > >
> > > diff -r 1d07bf106c2a -r 6b00771ea6ce mercurial/demandimport.py
> > > --- a/mercurial/demandimport.py Wed Sep 04 18:42:55 2013 -0700
> > > +++ b/mercurial/demandimport.py Fri Sep 06 21:46:20 2013 -0400
> > > @@ -25,6 +25,7 @@
> > >  '''
> > >
> > >  import __builtin__
> > > +import __future__
> > >  _origimport = __import__
> > >
> > >  nothing = object()
> > > @@ -55,7 +56,7 @@
> > >      def _load(self):
> > >          if not self._module:
> > >              head, globals, locals, after = self._data
> > > -            mod = _origimport(head, globals, locals)
> > > +            mod = _origimport(head, globals, locals, [],
> > > + self._level())
> > >              # load submodules
> > >              def subload(mod, p):
> > >                  h, t = p, None
> > > @@ -74,6 +75,18 @@
> > >                  locals[head] = mod
> > >              object.__setattr__(self, "_module", mod)
> > >
> > > +    def _level(self):
> > > +        """
> > > +        Determine the 'level' parameter to the __import__ function,
based
> > > on
> > > +        self._data.
> > > +        """
> > > +        head, globals, locals, after = self._data
> > > +        abs_import = globals.get('absolute_import', None)
> > > +        if isinstance(abs_import, __future__._Feature):
> > > +            # absolute_import was indicated, so disallow relative
imports
> > > +            return 0
> > > +        return -1
> > > +
> > >      def __repr__(self):
> > >          if self._module:
> > >              return "<proxied module '%s'>" % self._data[0] @@ -81,7
> > > +94,7 @@
> > >      def __call__(self, *args, **kwargs):
> > >          raise TypeError("%s object is not callable" % repr(self))
> > >      def __getattribute__(self, attr):
> > > -        if attr in ('_data', '_extend', '_load', '_module'):
> > > +        if attr in ('_data', '_extend', '_load', '_module',
'_level'):
> > >              return object.__getattribute__(self, attr)
> > >          self._load()
> > >          return getattr(self._module, attr) diff -r 1d07bf106c2a -r
> > > 6b00771ea6ce tests/test-demandimport-absolute.py
> > > --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> > > +++ b/tests/test-demandimport-absolute.py       Fri Sep 06 21:46:20
2013 -
> > 0400
> > > @@ -0,0 +1,46 @@
> > > +"test demand import when absolute_import is indicated"
> > > +
> > > +import os
> > > +import sys
> > > +import shutil
> > > +import textwrap
> > > +import unittest
> > > +
> > > +import silenttestrunner
> > > +
> > > +from mercurial import demandimport
> > > +
> > > +class TestAbsoluteImport(unittest.TestCase):
> > > +
> > > +    def setUp(self):
> > > +        os.mkdir('pkg')
> > > +        f = open('pkg/mod.py', 'w')
> > > +        f.write(textwrap.dedent("""
> > > +            from __future__ import absolute_import
> > > +            import os
> > > +            """).lstrip())
> > > +        f.close()
> > > +        f = open('pkg/__init__.py', 'w')
> > > +        f.close()
> > > +        f = open('pkg/os.py', 'w')
> > > +        f.write('''val = "this is not the module you're looking
> > > for"\n''')
> > > +        f.close()
> > > +        demandimport.enable()
> > > +
> > > +    def tearDown(self):
> > > +        shutil.rmtree('pkg')
> > > +        demandimport.disable()
> > > +
> > > +    def test_absolute_import(self):
> > > +        if sys.version_info < (2,5):
> > > +            print("Test only viable on Python 2.5 or later")
> > > +            return
> > > +        import pkg.mod
> > > +        # trigger the loading of the module
> > > +        pkg.mod.__name__
> > > +        assert pkg.mod.os.__name__ == 'os'
> > > +        assert 'devnull' in dir(pkg.mod.os)
> > > +        assert 'val' not in dir(pkg.mod.os)
> > > +
> > > +if __name__ == '__main__':
> > > +    silenttestrunner.main(__name__)
> > > _______________________________________________
> > > Mercurial-devel mailing list
> > > Mercurial-devel at selenic.com
> > > http://selenic.com/mailman/listinfo/mercurial-devel
> > >
> >
> > ----------------------------------------------------------------------
> > [FUJIWARA Katsunori]                             foozy at lares.dti.ne.jp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 6572 bytes
Desc: not available
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20130907/e06d8fd8/attachment.p7s>


More information about the Mercurial-devel mailing list