3 # Allow execution from anywhere
7 sys
.path
.insert(0, os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
))))
13 from devscripts
.tomlparse
import parse_toml
14 from devscripts
.utils
import read_file
18 parser
= argparse
.ArgumentParser(description
='Install dependencies for yt-dlp')
20 'input', nargs
='?', metavar
='TOMLFILE', default
='pyproject.toml', help='Input file (default: %(default)s)')
22 '-e', '--exclude', metavar
='DEPENDENCY', action
='append', help='Exclude a dependency')
24 '-i', '--include', metavar
='GROUP', action
='append', help='Include an optional dependency group')
26 '-o', '--only-optional', action
='store_true', help='Only install optional dependencies')
28 '-p', '--print', action
='store_true', help='Only print a requirements.txt to stdout')
30 '-u', '--user', action
='store_true', help='Install with pip as --user')
31 return parser
.parse_args()
36 project_table
= parse_toml(read_file(args
.input))['project']
37 optional_groups
= project_table
['optional-dependencies']
38 excludes
= args
.exclude
or []
41 if not args
.only_optional
: # `-o` should exclude 'dependencies' and the 'default' group
42 deps
.extend(project_table
['dependencies'])
43 if 'default' not in excludes
: # `--exclude default` should exclude entire 'default' group
44 deps
.extend(optional_groups
['default'])
47 return re
.match(r
'[\w-]+', dependency
)[0].lower()
49 target_map
= {name(dep): dep for dep in deps}
51 for include
in filter(None, map(optional_groups
.get
, args
.include
or [])):
52 target_map
.update(zip(map(name
, include
), include
))
54 for exclude
in map(name
, excludes
):
55 target_map
.pop(exclude
, None)
57 targets
= list(target_map
.values())
60 for target
in targets
:
64 pip_args
= [sys
.executable
, '-m', 'pip', 'install', '-U']
66 pip_args
.append('--user')
67 pip_args
.extend(targets
)
69 return subprocess
.call(pip_args
)
72 if __name__
== '__main__':