-
Notifications
You must be signed in to change notification settings - Fork 6.2k
/
Copy pathpython.bzl
98 lines (88 loc) · 3.64 KB
/
python.bzl
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
90
91
92
93
94
95
96
97
98
load("@bazel_skylib//lib:paths.bzl", "paths")
# py_test_module_list creates a py_test target for each
# Python file in `files`
def _convert_target_to_import_path(t):
"""Get a Python import path for the provided bazel file target."""
if not t.startswith("//"):
fail("Must be an absolute target starting in '//'.")
if not t.endswith(".py"):
fail("Must end in '.py'.")
# 1) Strip known prefix and suffix (validated above).
t = t[len("//"):-len(".py")]
# 2) Normalize separators to '/'.
t = t.replace(":", "/")
# 3) Replace '/' with '.' to form an import path.
return t.replace("/", ".")
def doctest(files, gpu = False, name="doctest", deps=[], srcs=[], data=[], args=[], size="medium", tags=[], pytest_plugin_file="//bazel:default_doctest_pytest_plugin.py", **kwargs):
# NOTE: If you run `pytest` on `__init__.py`, it tries to test all files in that
# package. We don't want that, so we exclude it from the list of input files.
files = native.glob(include=files, exclude=["__init__.py"])
if gpu:
name += "[gpu]"
tags = tags + ["gpu"]
else:
tags = tags + ["cpu"]
native.py_test(
name = name,
srcs = ["//bazel:pytest_wrapper.py"] + srcs,
main = "//bazel:pytest_wrapper.py",
size = size,
args = [
"--doctest-modules",
"--doctest-glob='*.md'",
"--disable-warnings",
"-v",
# Don't pick up the global pytest.ini for doctests.
"-c", "NO_PYTEST_CONFIG",
# Pass the provided pytest plugin as a Python import path.
"-p", _convert_target_to_import_path(pytest_plugin_file),
] + args + ["$(location :%s)" % file for file in files],
data = [pytest_plugin_file] + files + data,
python_version = "PY3",
srcs_version = "PY3",
tags = ["doctest"] + tags,
deps = ["//:ray_lib"] + deps,
**kwargs
)
def py_test_module_list(files, size, deps, extra_srcs=[], name_suffix="", **kwargs):
for file in files:
# remove .py
name = paths.split_extension(file)[0] + name_suffix
if name == file:
basename = basename + "_test"
native.py_test(
name = name,
size = size,
main = file,
srcs = extra_srcs + [file],
deps = deps,
**kwargs
)
def py_test_run_all_subdirectory(include, exclude, extra_srcs, **kwargs):
for file in native.glob(include = include, exclude = exclude, allow_empty=False):
basename = paths.split_extension(file)[0]
if basename == file:
basename = basename + "_test"
native.py_test(
name = basename,
srcs = extra_srcs + [file],
**kwargs
)
# Runs all included notebooks as py_test targets, by first converting them to .py files with "test_myst_doc.py".
def py_test_run_all_notebooks(include, exclude, allow_empty=False, **kwargs):
for file in native.glob(include = include, exclude = exclude, allow_empty=allow_empty):
print(file)
basename = paths.split_extension(file)[0]
if basename == file:
basename = basename + "_test"
native.py_test(
name = basename,
main = "test_myst_doc.py",
srcs = ["//doc:test_myst_doc.py"],
# --find-recursively will look for file in all
# directories inside cwd recursively if it cannot
# find it right away. This allows to deal with
# mismatches between `name` and `data` args.
args = ["--find-recursively", "--path", file],
**kwargs
)