Skip to content

Commit

Permalink
Merge pull request #11195 from pradyunsg/distutils-replace-fancygetop…
Browse files Browse the repository at this point in the history
…t-with-getopt

Replace `distutils.fancy_getopt` with `getopt`
  • Loading branch information
sbidoul authored Jul 10, 2022
2 parents 99818e1 + 8cbb89b commit f66b3e8
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 26 deletions.
51 changes: 26 additions & 25 deletions src/pip/_internal/utils/distutils_args.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,43 @@
from distutils.errors import DistutilsArgError
from distutils.fancy_getopt import FancyGetopt
from getopt import GetoptError, getopt
from typing import Dict, List

_options = [
("exec-prefix=", None, ""),
("home=", None, ""),
("install-base=", None, ""),
("install-data=", None, ""),
("install-headers=", None, ""),
("install-lib=", None, ""),
("install-platlib=", None, ""),
("install-purelib=", None, ""),
("install-scripts=", None, ""),
("prefix=", None, ""),
("root=", None, ""),
("user", None, ""),
"exec-prefix=",
"home=",
"install-base=",
"install-data=",
"install-headers=",
"install-lib=",
"install-platlib=",
"install-purelib=",
"install-scripts=",
"prefix=",
"root=",
"user",
]


# typeshed doesn't permit Tuple[str, None, str], see python/typeshed#3469.
_distutils_getopt = FancyGetopt(_options) # type: ignore


def parse_distutils_args(args: List[str]) -> Dict[str, str]:
"""Parse provided arguments, returning an object that has the
matched arguments.
"""Parse provided arguments, returning an object that has the matched arguments.
Any unknown arguments are ignored.
"""
result = {}
for arg in args:
try:
_, match = _distutils_getopt.getopt(args=[arg])
except DistutilsArgError:
parsed_opt, _ = getopt(args=[arg], shortopts="", longopts=_options)
except GetoptError:
# We don't care about any other options, which here may be
# considered unrecognized since our option list is not
# exhaustive.
pass
else:
result.update(match.__dict__)
continue

if not parsed_opt:
continue

option = parsed_opt[0]
name_from_parsed = option[0][2:].replace("-", "_")
value_from_parsed = option[1] or "true"
result[name_from_parsed] = value_from_parsed

return result
2 changes: 1 addition & 1 deletion tests/unit/test_utils_distutils_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,4 @@ def test_all_value_options_work(name: str, value: str) -> None:

def test_user_option_works() -> None:
result = parse_distutils_args(["--user"])
assert result["user"] == 1
assert result["user"]

0 comments on commit f66b3e8

Please sign in to comment.