69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
"""
|
|
Create a dist_info directory
|
|
As defined in the wheel specification
|
|
"""
|
|
|
|
import os
|
|
import re
|
|
import warnings
|
|
from inspect import cleandoc
|
|
|
|
from distutils.core import Command
|
|
from distutils import log
|
|
from setuptools.extern import packaging
|
|
|
|
|
|
class dist_info(Command):
|
|
|
|
description = 'create a .dist-info directory'
|
|
|
|
user_options = [
|
|
('egg-base=', 'e', "directory containing .egg-info directories"
|
|
" (default: top of the source tree)"),
|
|
]
|
|
|
|
def initialize_options(self):
|
|
self.egg_base = None
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
egg_info = self.get_finalized_command('egg_info')
|
|
egg_info.egg_base = self.egg_base
|
|
egg_info.finalize_options()
|
|
egg_info.run()
|
|
name = _safe(self.distribution.get_name())
|
|
version = _version(self.distribution.get_version())
|
|
base = self.egg_base or os.curdir
|
|
dist_info_dir = os.path.join(base, f"{name}-{version}.dist-info")
|
|
log.info("creating '{}'".format(os.path.abspath(dist_info_dir)))
|
|
|
|
bdist_wheel = self.get_finalized_command('bdist_wheel')
|
|
bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir)
|
|
|
|
|
|
def _safe(component: str) -> str:
|
|
"""Escape a component used to form a wheel name according to PEP 491"""
|
|
return re.sub(r"[^\w\d.]+", "_", component)
|
|
|
|
|
|
def _version(version: str) -> str:
|
|
"""Convert an arbitrary string to a version string."""
|
|
v = version.replace(' ', '.')
|
|
try:
|
|
return str(packaging.version.Version(v)).replace("-", "_")
|
|
except packaging.version.InvalidVersion:
|
|
msg = f"""Invalid version: {version!r}.
|
|
!!\n\n
|
|
###################
|
|
# Invalid version #
|
|
###################
|
|
{version!r} is not valid according to PEP 440.\n
|
|
Please make sure specify a valid version for your package.
|
|
Also note that future releases of setuptools may halt the build process
|
|
if an invalid version is given.
|
|
\n\n!!
|
|
"""
|
|
warnings.warn(cleandoc(msg))
|
|
return _safe(v).strip("_")
|