__init__.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. """
  2. Wheel command-line utility.
  3. """
  4. from __future__ import annotations
  5. import argparse
  6. import os
  7. import sys
  8. from argparse import ArgumentTypeError
  9. from ..wheelfile import WheelError
  10. def unpack_f(args: argparse.Namespace) -> None:
  11. from .unpack import unpack
  12. unpack(args.wheelfile, args.dest)
  13. def pack_f(args: argparse.Namespace) -> None:
  14. from .pack import pack
  15. pack(args.directory, args.dest_dir, args.build_number)
  16. def convert_f(args: argparse.Namespace) -> None:
  17. from .convert import convert
  18. convert(args.files, args.dest_dir, args.verbose)
  19. def tags_f(args: argparse.Namespace) -> None:
  20. from .tags import tags
  21. names = (
  22. tags(
  23. wheel,
  24. args.python_tag,
  25. args.abi_tag,
  26. args.platform_tag,
  27. args.build,
  28. args.remove,
  29. )
  30. for wheel in args.wheel
  31. )
  32. for name in names:
  33. print(name)
  34. def version_f(args: argparse.Namespace) -> None:
  35. from .. import __version__
  36. print(f"wheel {__version__}")
  37. def parse_build_tag(build_tag: str) -> str:
  38. if build_tag and not build_tag[0].isdigit():
  39. raise ArgumentTypeError("build tag must begin with a digit")
  40. elif "-" in build_tag:
  41. raise ArgumentTypeError("invalid character ('-') in build tag")
  42. return build_tag
  43. TAGS_HELP = """\
  44. Make a new wheel with given tags. Any tags unspecified will remain the same.
  45. Starting the tags with a "+" will append to the existing tags. Starting with a
  46. "-" will remove a tag (use --option=-TAG syntax). Multiple tags can be
  47. separated by ".". The original file will remain unless --remove is given. The
  48. output filename(s) will be displayed on stdout for further processing.
  49. """
  50. def parser() -> argparse.ArgumentParser:
  51. p = argparse.ArgumentParser()
  52. s = p.add_subparsers(help="commands")
  53. unpack_parser = s.add_parser("unpack", help="Unpack wheel")
  54. unpack_parser.add_argument(
  55. "--dest", "-d", help="Destination directory", default="."
  56. )
  57. unpack_parser.add_argument("wheelfile", help="Wheel file")
  58. unpack_parser.set_defaults(func=unpack_f)
  59. repack_parser = s.add_parser("pack", help="Repack wheel")
  60. repack_parser.add_argument("directory", help="Root directory of the unpacked wheel")
  61. repack_parser.add_argument(
  62. "--dest-dir",
  63. "-d",
  64. default=os.path.curdir,
  65. help="Directory to store the wheel (default %(default)s)",
  66. )
  67. repack_parser.add_argument(
  68. "--build-number", help="Build tag to use in the wheel name"
  69. )
  70. repack_parser.set_defaults(func=pack_f)
  71. convert_parser = s.add_parser("convert", help="Convert egg or wininst to wheel")
  72. convert_parser.add_argument("files", nargs="*", help="Files to convert")
  73. convert_parser.add_argument(
  74. "--dest-dir",
  75. "-d",
  76. default=os.path.curdir,
  77. help="Directory to store wheels (default %(default)s)",
  78. )
  79. convert_parser.add_argument("--verbose", "-v", action="store_true")
  80. convert_parser.set_defaults(func=convert_f)
  81. tags_parser = s.add_parser(
  82. "tags", help="Add or replace the tags on a wheel", description=TAGS_HELP
  83. )
  84. tags_parser.add_argument("wheel", nargs="*", help="Existing wheel(s) to retag")
  85. tags_parser.add_argument(
  86. "--remove",
  87. action="store_true",
  88. help="Remove the original files, keeping only the renamed ones",
  89. )
  90. tags_parser.add_argument(
  91. "--python-tag", metavar="TAG", help="Specify an interpreter tag(s)"
  92. )
  93. tags_parser.add_argument("--abi-tag", metavar="TAG", help="Specify an ABI tag(s)")
  94. tags_parser.add_argument(
  95. "--platform-tag", metavar="TAG", help="Specify a platform tag(s)"
  96. )
  97. tags_parser.add_argument(
  98. "--build", type=parse_build_tag, metavar="BUILD", help="Specify a build tag"
  99. )
  100. tags_parser.set_defaults(func=tags_f)
  101. version_parser = s.add_parser("version", help="Print version and exit")
  102. version_parser.set_defaults(func=version_f)
  103. help_parser = s.add_parser("help", help="Show this help")
  104. help_parser.set_defaults(func=lambda args: p.print_help())
  105. return p
  106. def main() -> int:
  107. p = parser()
  108. args = p.parse_args()
  109. if not hasattr(args, "func"):
  110. p.print_help()
  111. else:
  112. try:
  113. args.func(args)
  114. return 0
  115. except WheelError as e:
  116. print(e, file=sys.stderr)
  117. return 1