Skip to content

Commit 0089714

Browse files
jcfrthewtex
authored andcommitted
windows_build_wheels: Move util functions into dedicated module
1 parent e59be7d commit 0089714

File tree

2 files changed

+98
-85
lines changed

2 files changed

+98
-85
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
2+
"""This module provides convenient function facilitating scripting.
3+
4+
These functions have been copied from scikit-build project.
5+
See https://github.com/scikit-build/scikit-build
6+
"""
7+
8+
import errno
9+
import os
10+
11+
from contextlib import contextmanager
12+
from functools import wraps
13+
14+
15+
def mkdir_p(path):
16+
"""Ensure directory ``path`` exists. If needed, parent directories
17+
are created.
18+
19+
Adapted from http://stackoverflow.com/a/600612/1539918
20+
"""
21+
try:
22+
os.makedirs(path)
23+
except OSError as exc: # Python >2.5
24+
if exc.errno == errno.EEXIST and os.path.isdir(path):
25+
pass
26+
else: # pragma: no cover
27+
raise
28+
29+
30+
@contextmanager
31+
def push_env(**kwargs):
32+
"""This context manager allow to set/unset environment variables.
33+
"""
34+
saved_env = dict(os.environ)
35+
for var, value in kwargs.items():
36+
if value is not None:
37+
os.environ[var] = value
38+
elif var in os.environ:
39+
del os.environ[var]
40+
yield
41+
os.environ.clear()
42+
for (saved_var, saved_value) in saved_env.items():
43+
os.environ[saved_var] = saved_value
44+
45+
46+
class ContextDecorator(object):
47+
"""A base class or mixin that enables context managers to work as
48+
decorators."""
49+
50+
def __init__(self, **kwargs):
51+
self.__dict__.update(kwargs)
52+
53+
def __enter__(self):
54+
# Note: Returning self means that in "with ... as x", x will be self
55+
return self
56+
57+
def __exit__(self, typ, val, traceback):
58+
pass
59+
60+
def __call__(self, func):
61+
@wraps(func)
62+
def inner(*args, **kwds): # pylint:disable=missing-docstring
63+
with self:
64+
return func(*args, **kwds)
65+
return inner
66+
67+
68+
class push_dir(ContextDecorator):
69+
"""Context manager to change current directory.
70+
"""
71+
def __init__(self, directory=None, make_directory=False):
72+
"""
73+
:param directory:
74+
Path to set as current working directory. If ``None``
75+
is passed, ``os.getcwd()`` is used instead.
76+
77+
:param make_directory:
78+
If True, ``directory`` is created.
79+
"""
80+
self.directory = None
81+
self.make_directory = None
82+
self.old_cwd = None
83+
super(push_dir, self).__init__(
84+
directory=directory, make_directory=make_directory)
85+
86+
def __enter__(self):
87+
self.old_cwd = os.getcwd()
88+
if self.directory:
89+
if self.make_directory:
90+
mkdir_p(self.directory)
91+
os.chdir(self.directory)
92+
return self
93+
94+
def __exit__(self, typ, val, traceback):
95+
os.chdir(self.old_cwd)

scripts/windows_build_wheels.py

Lines changed: 3 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11

2-
import errno
32
import json
43
import os
54
import shutil
5+
import sys
66
import tempfile
77
import textwrap
88

9-
from contextlib import contextmanager
10-
from functools import wraps
119
from subprocess import check_call, check_output
1210

1311

@@ -19,88 +17,8 @@
1917
print("ROOT_DIR: %s" % ROOT_DIR)
2018
print("STANDALONE_DIR: %s" % STANDALONE_DIR)
2119

22-
23-
def mkdir_p(path):
24-
"""Ensure directory ``path`` exists. If needed, parent directories
25-
are created.
26-
27-
Adapted from http://stackoverflow.com/a/600612/1539918
28-
"""
29-
try:
30-
os.makedirs(path)
31-
except OSError as exc: # Python >2.5
32-
if exc.errno == errno.EEXIST and os.path.isdir(path):
33-
pass
34-
else: # pragma: no cover
35-
raise
36-
37-
38-
@contextmanager
39-
def push_env(**kwargs):
40-
"""This context manager allow to set/unset environment variables.
41-
"""
42-
saved_env = dict(os.environ)
43-
for var, value in kwargs.items():
44-
if value is not None:
45-
os.environ[var] = value
46-
elif var in os.environ:
47-
del os.environ[var]
48-
yield
49-
os.environ.clear()
50-
for (saved_var, saved_value) in saved_env.items():
51-
os.environ[saved_var] = saved_value
52-
53-
54-
class ContextDecorator(object):
55-
"""A base class or mixin that enables context managers to work as
56-
decorators."""
57-
58-
def __init__(self, **kwargs):
59-
self.__dict__.update(kwargs)
60-
61-
def __enter__(self):
62-
# Note: Returning self means that in "with ... as x", x will be self
63-
return self
64-
65-
def __exit__(self, typ, val, traceback):
66-
pass
67-
68-
def __call__(self, func):
69-
@wraps(func)
70-
def inner(*args, **kwds): # pylint:disable=missing-docstring
71-
with self:
72-
return func(*args, **kwds)
73-
return inner
74-
75-
76-
class push_dir(ContextDecorator):
77-
"""Context manager to change current directory.
78-
"""
79-
def __init__(self, directory=None, make_directory=False):
80-
"""
81-
:param directory:
82-
Path to set as current working directory. If ``None``
83-
is passed, ``os.getcwd()`` is used instead.
84-
85-
:param make_directory:
86-
If True, ``directory`` is created.
87-
"""
88-
self.directory = None
89-
self.make_directory = None
90-
self.old_cwd = None
91-
super(push_dir, self).__init__(
92-
directory=directory, make_directory=make_directory)
93-
94-
def __enter__(self):
95-
self.old_cwd = os.getcwd()
96-
if self.directory:
97-
if self.make_directory:
98-
mkdir_p(self.directory)
99-
os.chdir(self.directory)
100-
return self
101-
102-
def __exit__(self, typ, val, traceback):
103-
os.chdir(self.old_cwd)
20+
sys.path.insert(0, os.path.join(SCRIPT_DIR, "internal"))
21+
from wheel_builder_utils import push_dir, push_env
10422

10523

10624
def pip_install(python_dir, package):

0 commit comments

Comments
 (0)