[Buildroot] [PATCH v3 1/1] utils/scanpypi: add flit package support

James Hilliard james.hilliard1 at gmail.com
Mon Nov 28 18:28:52 UTC 2022


On Mon, Nov 28, 2022 at 2:40 AM Yegor Yefremov
<yegorslists at googlemail.com> wrote:
>
> Hi James,
>
> On Thu, Aug 18, 2022 at 10:26 AM James Hilliard
> <james.hilliard1 at gmail.com> wrote:
> >
> > These packages don't have a setup.py so we instead need to parse their
> > pyproject.toml file.
> >
> > Note that this currently doesn't handle flit package dependency
> > resolution.
> >
> > Signed-off-by: James Hilliard <james.hilliard1 at gmail.com>
> > ---
> > Changes v2 -> v3:
> >   - minor cleanup
> >   - rebase
> >   - more detailed  commit log
> > Changes v1 -> v2:
> >   - remove homepage format fixes(sent as separate patch)
> >   - remove load_setup fixes
> > ---
> >  utils/scanpypi | 78 ++++++++++++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 76 insertions(+), 2 deletions(-)
> >
> > diff --git a/utils/scanpypi b/utils/scanpypi
> > index 452b4a3fc3..bce7c01494 100755
> > --- a/utils/scanpypi
> > +++ b/utils/scanpypi
> > @@ -42,6 +42,48 @@ except ImportError:
> >            'pip install spdx_lookup')
> >      liclookup = None
> >
> > +def toml_load(f):
> > +    with open(f, 'rb') as fh:
> > +        ex = None
> > +
> > +        # Try regular tomli first
> > +        try:
> > +            from tomli import load
> > +            return load(fh)
> > +        except ImportError as e:
> > +            ex = e
> > +
> > +        # Try pip's vendored tomli
> > +        try:
> > +            from pip._vendor.tomli import load
> > +            try:
> > +                return load(fh)
> > +            except TypeError:
> > +                # Fallback to handle older version
> > +                try:
> > +                    fh.seek(0)
> > +                    w = io.TextIOWrapper(fh, encoding="utf8", newline="")
> > +                    return load(w)
> > +                finally:
> > +                    w.detach()
> > +        except ImportError as e:
> > +            pass
> > +
> > +        # Try regular toml last
> > +        try:
> > +            from toml import load
> > +            fh.seek(0)
> > +            w = io.TextIOWrapper(fh, encoding="utf8", newline="")
> > +            try:
> > +                return load(w)
> > +            finally:
> > +                w.detach()
> > +        except ImportError:
> > +            pass
> > +
> > +        print('This package needs tomli')
> > +        raise ex
> > +
> >
> >  def setup_decorator(func, method):
> >      """
> > @@ -316,6 +358,35 @@ class BuildrootPackage():
> >              os.chdir(current_dir)
> >              sys.path.remove(self.tmp_extract)
> >
> > +    def load_pyproject(self):
> > +        """
> > +        Loads the corresponding pyproject.toml and store its metadata
> > +        """
> > +        current_dir = os.getcwd()
> > +        os.chdir(self.tmp_extract)
> > +        sys.path.insert(0, self.tmp_extract)
> > +        try:
> > +            pyproject_data = toml_load('pyproject.toml')
> > +            try:
> > +                self.setup_metadata = pyproject_data.get('project', {})
> > +                self.metadata_name = self.setup_metadata.get('name', self.real_name)
> > +                build_system = pyproject_data.get('build-system', {})
> > +                build_backend = build_system.get('build-backend', None)
> > +                if build_backend is not None and build_backend == 'flit_core.buildapi':
>
> What about using the bool interpretation of None?
>                      if build_backend and build_backend == 'flit_core.buildapi':

Sure, changed to that style in v4:
https://patchwork.ozlabs.org/project/buildroot/patch/20221128182304.1915237-1-james.hilliard1@gmail.com/

>
> > +                    self.setup_metadata['method'] = 'flit'
> > +                elif build_system.get('backend-path', None) is not None:
> > +                    self.setup_metadata['method'] = 'pep517'
>
> What about detecting "setuptools"?
>                     elif 'setuptools.build_meta' in build_backend:
>                          self.setup_metadata['method'] = 'setuptools'
>
> See [1] for the reference.
>
> [1] https://github.com/pythongssapi/python-gssapi/blob/main/pyproject.toml#L6

We already try to use setuptools before pep517/pyproject.toml, there's some
issues there still but I was waiting for this to get merged before looking into
that in more detail, I don't think searching for setuptools from pyproject.toml
is likely to be all that helpful since setuptools is the implicit fallback when
pyproject.toml is not present in a pypi package anyways.

>
> Regards,
> Yegor
>
> > +                else:
> > +                    self.setup_metadata['method'] = 'unknown'
> > +            except KeyError:
> > +                print('ERROR: Could not determine package metadata for {pkg}.\n'
> > +                      .format(pkg=self.real_name))
> > +                raise
> > +        except FileNotFoundError:
> > +            raise
> > +        os.chdir(current_dir)
> > +        sys.path.remove(self.tmp_extract)
> > +
> >      def get_requirements(self, pkg_folder):
> >          """
> >          Retrieve dependencies from the metadata found in the setup.py script of
> > @@ -699,9 +770,12 @@ def main():
> >              except ImportError as err:
> >                  if 'buildutils' in str(err):
> >                      print('This package needs buildutils')
> > +                    continue
> >                  else:
> > -                    raise
> > -                continue
> > +                    try:
> > +                        package.load_pyproject()
> > +                    except Exception as e:
> > +                        raise
> >              except (AttributeError, KeyError) as error:
> >                  print('Error: Could not install package {pkg}: {error}'.format(
> >                      pkg=package.real_name, error=error))
> > --
> > 2.34.1
> >



More information about the buildroot mailing list