Skip to content

9.2.0 broke package discovery in pytest-asyncio==1.1.0 and older #1216

@mgorny

Description

@mgorny
$ uv pip install --no-binary pytest-asyncio pytest-asyncio==1.1.0
Using Python 3.13.7 environment at: /tmp/.venv
Resolved 6 packages in 1ms
  × Failed to build `pytest-asyncio==1.1.0`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `setuptools.build_meta.build_wheel` failed (exit status: 1)

      [stdout]
      No `name` configuration, performing automatic discovery
      No `packages` or `py_modules` configuration, performing automatic discovery.
      `flat-layout` detected -- analysing .
      discovered packages -- ['dependencies', 'pytest_asyncio', 'dependencies.default', 'dependencies.docs']
      No `name` configuration, performing automatic discovery

      [stderr]
      /home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools_scm/_integration/version_inference.py:51:
      UserWarning: version of None already set
        warnings.warn(self.message)
      No parent package detected, impossible to derive `name`
      Traceback (most recent call last):
        File "<string>", line 14, in <module>
          requires = get_requires_for_build({})
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/build_meta.py", line 331, in
      get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
                 ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/build_meta.py", line 301, in
      _get_build_requires
          self.run_setup()
          ~~~~~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/build_meta.py", line 317, in
      run_setup
          exec(code, locals())
          ~~~~^^^^^^^^^^^^^^^^
        File "<string>", line 1, in <module>
          import sys
      
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/__init__.py", line 115, in setup
          return distutils.core.setup(**attrs)
                 ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/_distutils/core.py", line 160,
      in setup
          dist.parse_config_files()
          ~~~~~~~~~~~~~~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/_virtualenv.py", line 20, in
      parse_config_files
          result = old_parse_config_files(self, *args, **kwargs)
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/dist.py", line 752, in
      parse_config_files
          setupcfg.parse_configuration(
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
              self, self.command_options, ignore_option_errors=ignore_option_errors
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/setupcfg.py", line 188,
      in parse_configuration
          meta.parse()
          ~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/setupcfg.py", line 502,
      in parse
          section_parser_method(section_options)
          ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/setupcfg.py", line 477,
      in parse_section
          self[name] = value
          ~~~~^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/setupcfg.py", line 294,
      in __setitem__
          parsed = self.parsers.get(option_name, lambda x: x)(value)
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/setupcfg.py", line 600,
      in _parse_version
          return expand.version(self._parse_attr(value, self.package_dir, self.root_dir))
                                ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/setupcfg.py", line 418,
      in _parse_attr
          package_dir.update(self.ensure_discovered.package_dir)
          ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "<frozen _collections_abc>", line 874, in __iter__
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/expand.py", line 452, in
      __iter__
          return iter(self._target())
                      ~~~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/expand.py", line 442, in
      _target
          self._value = self._obtain()
                        ~~~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/expand.py", line 412, in
      _get_package_dir
          self()
          ~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/config/expand.py", line 397, in
      __call__
          self._dist.set_defaults(name=False)  # Skip name, we can still be parsing
          ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/discovery.py", line 353, in
      __call__
          self._analyse_package_layout(ignore_ext_modules)
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/discovery.py", line 387, in
      _analyse_package_layout
          or self._analyse_flat_layout()
             ~~~~~~~~~~~~~~~~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/discovery.py", line 444, in
      _analyse_flat_layout
          return self._analyse_flat_packages() or self._analyse_flat_modules()
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/discovery.py", line 450, in
      _analyse_flat_packages
          self._ensure_no_accidental_inclusion(top_level, "packages")
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/mgorny/.cache/uv/builds-v0/.tmpYbjHxq/lib/python3.13/site-packages/setuptools/discovery.py", line 480, in
      _ensure_no_accidental_inclusion
          raise PackageDiscoveryError(cleandoc(msg))
      setuptools.errors.PackageDiscoveryError: Multiple top-level packages discovered in a flat-layout: ['dependencies',
      'pytest_asyncio'].

      To avoid accidental inclusion of unwanted files or directories,
      setuptools will not proceed with this build.

      If you are trying to create a single distribution with multiple packages
      on purpose, you should not rely on automatic discovery.
      Instead, consider the following options:

      1. set up custom discovery (`find` directive with `include` or `exclude`)
      2. use a `src-layout`
      3. explicitly set `py_modules` or `packages` with a list of names

      To find more information, look for "package discovery" on setuptools docs.

      hint: This usually indicates a problem with the package or the build environment.

Builds fine if I constrain to setuptools-scm<9.2.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions