praiskup / argparse-manpage

Automatically build man-pages for your Python project
Apache License 2.0
40 stars 21 forks source link

Build fails when manpages are already present #105

Open marcelzwiers opened 11 months ago

marcelzwiers commented 11 months ago

This is a bit of a minor issue that you can ignore and close if you think it's irrelevant :-)

The issue: I included the manpage build instructions for my pyproject.toml file as recommended here and it all works fine if I do a local pip-install:

(bidscoin) marzwi@localhost:~/bidscoin> pip install .
Processing /home/marzwi/bidscoin
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
[..]
Building wheels for collected packages: bidscoin
  Building wheel for bidscoin (pyproject.toml) ... done
  Created wheel for bidscoin: filename=bidscoin-4.1.1-py3-none-any.whl size=686401 sha256=[..]
  Stored in directory: /tmp/pip-ephem-wheel-cache-[..]
Successfully built bidscoin
Installing collected packages: bidscoin
Successfully installed bidscoin-4.1.1

However, if I run it again (e.g. after making some edits to my code) I get this error -- unless I first remove the newly generated man folder that is created in the cwd in the previous step:

(bidscoin) marzwi@localhost:~/bidscoin> pip install .
Processing /home/marzwi/bidscoin
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error

  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [91 lines of output]
      No `packages` or `py_modules` configuration, performing automatic discovery.
      `flat-layout` detected -- analysing .
      discovered packages -- ['bidscoin', 'man', 'bidscoin.bidsapps', 'bidscoin.cli', 'bidscoin.heuristics', 'bidscoin.plugins', 'bidscoin.schema', 'bidscoin.utilities', 'bidscoin.schema.meta', 'bidscoin.schema.objects', 'bidscoin.schema.rules', 'bidscoin.schema.rules.checks', 'bidscoin.schema.rules.files', 'bidscoin.schema.rules.sidecars', 'bidscoin.schema.rules.tabular_data', 'bidscoin.schema.rules.files.common', 'bidscoin.schema.rules.files.deriv', 'bidscoin.schema.rules.files.raw', 'bidscoin.schema.rules.sidecars.derivatives', 'bidscoin.schema.rules.tabular_data.derivatives']
      Traceback (most recent call last):
        File "/home/marzwi/miniconda3/envs/bidscoin/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/home/marzwi/miniconda3/envs/bidscoin/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/marzwi/miniconda3/envs/bidscoin/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
          return hook(config_settings)
                 ^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 355, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=['wheel'])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 325, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 341, in run_setup
          exec(code, locals())
        File "<string>", line 3, in <module>
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/__init__.py", line 103, in setup
          return distutils.core.setup(**attrs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/_distutils/core.py", line 159, in setup
          dist.parse_config_files()
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/dist.py", line 653, in parse_config_files
          pyprojecttoml.apply_configuration(self, filename, ignore_option_errors)
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 66, in apply_configuration
          config = read_configuration(filepath, True, ignore_option_errors, dist)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 131, in read_configuration
          return expand_configuration(asdict, root_dir, ignore_option_errors, dist)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 156, in expand_configuration
          return _ConfigExpander(config, root_dir, ignore_option_errors, dist).expand()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 203, in expand
          self._expand_cmdclass(package_dir)
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 228, in _expand_cmdclass
          self._process_field(self.setuptools_cfg, "cmdclass", cmdclass)
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 186, in _process_field
          container[field] = fn(container[field])
                             ^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 278, in cmdclass
          return {k: resolve_class(v, package_dir, root_dir) for k, v in values.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 278, in <dictcomp>
          return {k: resolve_class(v, package_dir, root_dir) for k, v in values.items()}
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 265, in resolve_class
          _parent_path, path, module_name = _find_module(pkg_name, package_dir, root_dir)
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 230, in _find_module
          if package_dir:
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 460, in __len__
          return len(self._target())
                     ^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 453, in _target
          self._value = self._obtain()
                        ^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 423, in _get_package_dir
          self()
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/config/expand.py", line 413, in __call__
          self._dist.set_defaults(name=False)  # Skip name, we can still be parsing
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/discovery.py", line 353, in __call__
          self._analyse_package_layout(ignore_ext_modules)
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/discovery.py", line 387, in _analyse_package_layout
          or self._analyse_flat_layout()
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/discovery.py", line 444, in _analyse_flat_layout
          return self._analyse_flat_packages() or self._analyse_flat_modules()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/site-packages/setuptools/discovery.py", line 450, in _analyse_flat_packages
          self._ensure_no_accidental_inclusion(top_level, "packages")
        File "/tmp/pip-build-env-f2d0u5il/overlay/lib/python3.11/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: ['man', 'bidscoin'].

      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.
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.

So the manpages have to be removed or overwritten, then all is fine

praiskup commented 11 months ago

Thank you very much reporting this. This seems worth fixing, but I don't see where the problem is.

Seems to me that this could be failing. Can you advice what needs to be fixed? https://github.com/praiskup/argparse-manpage/blob/42943e6ac7f311f8ab56268536880d11ee344512/build_manpages/build_manpages.py#L186

marcelzwiers commented 11 months ago

I am happy to test things (but anyone can easily reproduce the error), but I don't know how to do so. For instance, I know that argeparse-manpage is used during the build process but I have no idea where it is installed / how to use a locally modified version of argeparse-manpage