Knock together a handy py_project macro

This commit is contained in:
Reid 'arrdem' McKenzie 2021-08-03 19:27:57 -06:00
parent 6c6b0a060f
commit 4d8cd34cbc
2 changed files with 101 additions and 66 deletions

View file

@ -6,6 +6,7 @@ load("//tools/python:defs.bzl",
"py_unittest",
"py_pytest",
"py_resources",
"py_project",
)
load("@arrdem_source_pypi//:requirements.bzl",

View file

@ -10,102 +10,102 @@ load("@rules_python//python:defs.bzl",
def py_requirement(*args, **kwargs):
"""A re-export of requirement()"""
return _py_requirement(*args, **kwargs)
"""A re-export of requirement()"""
return _py_requirement(*args, **kwargs)
def py_test(python_version=None, **kwargs):
"""A re-export of py_test()"""
"""A re-export of py_test()"""
if python_version and python_version != "PY3":
fail("py3k only!")
if python_version and python_version != "PY3":
fail("py3k only!")
return _py_test(
python_version="PY3",
**kwargs,
)
return _py_test(
python_version="PY3",
**kwargs,
)
def py_pytest(name, srcs, deps, main=None, python_version=None, args=None, **kwargs):
"""A py_test target which uses pytest."""
"""A py_test target which uses pytest."""
if python_version and python_version != "PY3":
fail("py3k only!")
if python_version and python_version != "PY3":
fail("py3k only!")
f = "//tools/python:bzl_pytest_shim.py"
f = "//tools/python:bzl_pytest_shim.py"
deps = [
py_requirement("pytest"),
py_requirement("jedi"),
py_requirement("pytest-pudb"),
] + deps
deps = [
py_requirement("pytest"),
py_requirement("jedi"),
py_requirement("pytest-pudb"),
] + deps
srcs = [f] + srcs
srcs = [f] + srcs
t = py_test(
name = name,
srcs = srcs,
main = f,
args = args,
python_version="PY3",
deps = deps,
**kwargs,
)
t = py_test(
name = name,
srcs = srcs,
main = f,
args = args,
python_version="PY3",
deps = deps,
**kwargs,
)
# FIXME (arrdem 2020-09-27):
# This really needs to be a py_image_test.
# Not clear how to achieve that.
# py_image(
# name = name + ".containerized",
# main = f,
# args = args,
# srcs = srcs,
# deps = deps,
# **kwargs,
# )
# FIXME (arrdem 2020-09-27):
# This really needs to be a py_image_test.
# Not clear how to achieve that.
# py_image(
# name = name + ".containerized",
# main = f,
# args = args,
# srcs = srcs,
# deps = deps,
# **kwargs,
# )
return t
return t
def py_unittest(srcs=[], **kwargs):
"""A helper for running unittest tests"""
"""A helper for running unittest tests"""
f = "//tools/python:bzl_unittest_shim.py"
return py_test(
main = f,
srcs = [f] + srcs,
**kwargs
)
f = "//tools/python:bzl_unittest_shim.py"
return py_test(
main = f,
srcs = [f] + srcs,
**kwargs
)
def py_binary(python_version=None, main=None, srcs=None, **kwargs):
"""A re-export of py_binary()"""
"""A re-export of py_binary()"""
if python_version and python_version != "PY3":
fail("py3k only!")
if python_version and python_version != "PY3":
fail("py3k only!")
srcs = srcs or []
if main not in srcs:
srcs = [main] + srcs
srcs = srcs or []
if main not in srcs:
srcs = [main] + srcs
return _py_binary(
python_version = "PY3",
main = main,
srcs = srcs,
**kwargs,
)
return _py_binary(
python_version = "PY3",
main = main,
srcs = srcs,
**kwargs,
)
def py_library(srcs_version=None, **kwargs):
"""A re-export of py_library()"""
"""A re-export of py_library()"""
if srcs_version and srcs_version != "PY3":
fail("py3k only!")
if srcs_version and srcs_version != "PY3":
fail("py3k only!")
return _py_library(
srcs_version="PY3",
**kwargs
)
return _py_library(
srcs_version="PY3",
**kwargs
)
ResourceGroupInfo = provider(
@ -144,3 +144,37 @@ py_resources = rule(
),
},
)
def py_project(name=None,
lib_srcs=None,
lib_deps=None,
test_srcs=None,
test_deps=None):
"""
A helper for defining conventionally-formatted python project.
Assumes that there's a src/python tree, and a src/test tree.
Each test_*.py source generates its own implicit test target. This allows
for automatic test parallelism.
"""
lib_srcs = lib_srcs or native.glob(["src/python/**/*.py"])
test_srcs = test_srcs or native.glob(["test/python/**/*.py"])
py_library(
name=name,
srcs=lib_srcs,
deps=lib_deps,
imports=["src/python"],
)
for src in test_srcs:
if "test_" in src:
py_pytest(
name=name + ".test." + str(hash(src)).replace("-", "") + "." + src.split("/")[-1],
srcs=test_srcs,
deps=[name] + test_deps,
imports=["test/python"],
)