Created
March 23, 2024 20:02
-
-
Save LucK1Y/aaed36898b148b6dc1dc81ceecefc461 to your computer and use it in GitHub Desktop.
Extension for Argparser for files/directory paths. Stolen from here: https://stackoverflow.com/questions/11415570/directory-path-types-with-argparse
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from argparse import ArgumentTypeError as err | |
import os | |
class PathType(object): | |
def __init__(self, exists=True, path_type="file", dash_ok=True): | |
"""exists: | |
True: a path that does exist | |
False: a path that does not exist, in a valid parent directory | |
None: don't care | |
type: file, dir, symlink, None, or a function returning True for valid paths | |
None: don't care | |
dash_ok: whether to allow "-" as stdin/stdout""" | |
assert exists in (True, False, None) | |
assert path_type in ("file", "dir", "symlink", None) or hasattr( | |
path_type, "__call__" | |
) | |
self._exists = exists | |
self._type = path_type | |
self._dash_ok = dash_ok | |
def __call__(self, string): | |
if string == "-": | |
# the special argument "-" means sys.std{in,out} | |
if self._type == "dir": | |
raise err("standard input/output (-) not allowed as directory path") | |
elif self._type == "symlink": | |
raise err("standard input/output (-) not allowed as symlink path") | |
elif not self._dash_ok: | |
raise err("standard input/output (-) not allowed") | |
else: | |
e = os.path.exists(string) | |
if self._exists: | |
if not e: | |
raise err("path does not exist: '%s'" % string) | |
if self._type is None: | |
pass | |
elif self._type == "file": | |
if not os.path.isfile(string): | |
raise err("path is not a file: '%s'" % string) | |
elif self._type == "symlink": | |
if not os.path.symlink(string): | |
raise err("path is not a symlink: '%s'" % string) | |
elif self._type == "dir": | |
if not os.path.isdir(string): | |
raise err("path is not a directory: '%s'" % string) | |
elif not self._type(string): | |
raise err("path not valid: '%s'" % string) | |
else: | |
if self._exists == False and e: | |
raise err("path exists: '%s'" % string) | |
p = os.path.dirname(os.path.normpath(string)) or "." | |
if not os.path.isdir(p): | |
raise err("parent path is not a directory: '%s'" % p) | |
elif not os.path.exists(p): | |
raise err("parent directory does not exist: '%s'" % p) | |
return string |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment