Skip to content

Instantly share code, notes, and snippets.

@LucK1Y
Created March 23, 2024 20:02
Show Gist options
  • Save LucK1Y/aaed36898b148b6dc1dc81ceecefc461 to your computer and use it in GitHub Desktop.
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
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