forked from ionelmc/python-hunter
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbootstrap.py
More file actions
executable file
·89 lines (73 loc) · 2.82 KB
/
Copy pathbootstrap.py
File metadata and controls
executable file
·89 lines (73 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals
import os
import subprocess
import sys
from os.path import abspath
from os.path import dirname
from os.path import exists
from os.path import join
base_path = dirname(dirname(abspath(__file__)))
def check_call(args):
print('+', *args)
subprocess.check_call(args)
def exec_in_env():
env_path = join(base_path, '.tox', 'bootstrap')
if sys.platform == 'win32':
bin_path = join(env_path, 'Scripts')
else:
bin_path = join(env_path, 'bin')
if not exists(env_path):
import subprocess
print('Making bootstrap env in: {0} ...'.format(env_path))
try:
check_call([sys.executable, '-m', 'venv', env_path])
except subprocess.CalledProcessError:
try:
check_call([sys.executable, '-m', 'virtualenv', env_path])
except subprocess.CalledProcessError:
check_call(['virtualenv', env_path])
print('Installing `jinja2` into bootstrap environment...')
check_call([join(bin_path, 'pip'), 'install', 'jinja2', 'tox'])
python_executable = join(bin_path, 'python')
if not os.path.exists(python_executable):
python_executable += '.exe'
print('Re-executing with: {0}'.format(python_executable))
print('+ exec', python_executable, __file__, '--no-env')
os.execv(python_executable, [python_executable, __file__, '--no-env'])
def main():
import jinja2
print('Project path: {0}'.format(base_path))
jinja = jinja2.Environment(
loader=jinja2.FileSystemLoader(join(base_path, 'ci', 'templates')),
trim_blocks=True,
lstrip_blocks=True,
keep_trailing_newline=True
)
tox_environments = [
line.strip()
# 'tox' need not be installed globally, but must be importable
# by the Python that is running this script.
# This uses sys.executable the same way that the call in
# cookiecutter-pylibrary/hooks/post_gen_project.py
# invokes this bootstrap.py itself.
for line in subprocess.check_output([sys.executable, '-m', 'tox', '--listenvs'], universal_newlines=True).splitlines()
]
tox_environments = [line for line in tox_environments if line.startswith('py')]
for name in os.listdir(join('ci', 'templates')):
with open(join(base_path, name), 'w') as fh:
fh.write(jinja.get_template(name).render(tox_environments=tox_environments))
print('Wrote {}'.format(name))
print('DONE.')
if __name__ == '__main__':
args = sys.argv[1:]
if args == ['--no-env']:
main()
elif not args:
exec_in_env()
else:
print('Unexpected arguments {0}'.format(args), file=sys.stderr)
sys.exit(1)