1616for updating and testing the Gazelle manifest file.
1717"""
1818
19- load ("@io_bazel_rules_go//go:def.bzl" , "GoSource" , "go_binary" , "go_test" )
19+ load ("@bazel_skylib//rules:diff_test.bzl" , "diff_test" )
20+ load ("@io_bazel_rules_go//go:def.bzl" , "GoSource" , "go_test" )
21+ load ("@rules_python//python:defs.bzl" , "py_binary" )
2022
2123def gazelle_python_manifest (
2224 name ,
23- requirements ,
2425 modules_mapping ,
26+ requirements = [],
2527 pip_repository_name = "" ,
2628 pip_deps_repository_name = "" ,
2729 manifest = ":gazelle_python.yaml" ,
@@ -30,15 +32,18 @@ def gazelle_python_manifest(
3032
3133 Args:
3234 name: the name used as a base for the targets.
35+ modules_mapping: the target for the generated modules_mapping.json file.
3336 requirements: the target for the requirements.txt file or a list of
3437 requirements files that will be concatenated before passing on to
35- the manifest generator.
38+ the manifest generator. If unset, no integrity field is added to the
39+ manifest, meaning testing it is just as expensive as generating it,
40+ but modifying it is much less likely to result in a merge conflict.
3641 pip_repository_name: the name of the pip_install or pip_repository target.
3742 pip_deps_repository_name: deprecated - the old pip_install target name.
38- modules_mapping : the target for the generated modules_mapping.json file.
39- manifest: the target for the Gazelle manifest file .
40- **kwargs: other bazel attributes passed to the target target generated by
41- this macro.
43+ manifest : the Gazelle manifest file.
44+ defaults to the same value as manifest .
45+ **kwargs: other bazel attributes passed to the generate and test targets
46+ generated by this macro.
4247 """
4348 if pip_deps_repository_name != "" :
4449 # buildifier: disable=print
@@ -52,12 +57,17 @@ def gazelle_python_manifest(
5257 # This is a temporary check while pip_deps_repository_name exists as deprecated.
5358 fail ("pip_repository_name must be set in //{}:{}" .format (native .package_name (), name ))
5459
60+ test_target = "{}.test" .format (name )
5561 update_target = "{}.update" .format (name )
5662 update_target_label = "//{}:{}" .format (native .package_name (), update_target )
5763
64+ manifest_genrule = name + ".genrule"
65+ generated_manifest = name + ".generated_manifest"
66+ manifest_generator = Label ("//manifest/generate:generate" )
5867 manifest_generator_hash = Label ("//manifest/generate:generate_lib_sources_hash" )
5968
60- if type (requirements ) == "list" :
69+ if requirements and type (requirements ) == "list" :
70+ # This runs if requirements is a list or is unset (default value is empty list)
6171 native .genrule (
6272 name = name + "_requirements_gen" ,
6373 srcs = sorted (requirements ),
@@ -68,56 +78,71 @@ def gazelle_python_manifest(
6878 requirements = name + "_requirements_gen"
6979
7080 update_args = [
71- "--manifest-generator-hash" ,
72- "$(rootpath {})" .format (manifest_generator_hash ),
73- "--requirements" ,
74- "$(rootpath {})" .format (requirements ),
75- "--pip-repository-name" ,
76- pip_repository_name ,
77- "--modules-mapping" ,
78- "$(rootpath {})" .format (modules_mapping ),
79- "--output" ,
80- "$(rootpath {})" .format (manifest ),
81- "--update-target" ,
82- update_target_label ,
81+ "--manifest-generator-hash=$(execpath {})" .format (manifest_generator_hash ),
82+ "--requirements=$(rootpath {})" .format (requirements ) if requirements else "--requirements=" ,
83+ "--pip-repository-name={}" .format (pip_repository_name ),
84+ "--modules-mapping=$(execpath {})" .format (modules_mapping ),
85+ "--output=$(execpath {})" .format (generated_manifest ),
86+ "--update-target={}" .format (update_target_label ),
8387 ]
8488
85- go_binary (
86- name = update_target ,
87- embed = [Label ("//manifest/generate:generate_lib" )],
88- data = [
89- manifest ,
89+ native .genrule (
90+ name = manifest_genrule ,
91+ outs = [generated_manifest ],
92+ cmd = "$(execpath {}) {}" .format (manifest_generator , " " .join (update_args )),
93+ tools = [manifest_generator ],
94+ srcs = [
9095 modules_mapping ,
91- requirements ,
9296 manifest_generator_hash ,
93- ],
94- args = update_args ,
95- visibility = ["//visibility:private" ],
96- tags = ["manual" ],
97+ ] + ([requirements ] if requirements else []),
9798 )
9899
99- attrs = {
100- "env" : {
101- "_TEST_MANIFEST" : "$(rootpath {})" .format (manifest ),
102- "_TEST_MANIFEST_GENERATOR_HASH" : "$(rootpath {})" .format (manifest_generator_hash ),
103- "_TEST_REQUIREMENTS" : "$(rootpath {})" .format (requirements ),
104- },
105- "size" : "small" ,
106- }
107- go_test (
108- name = "{}.test" .format (name ),
109- srcs = [Label ("//manifest/test:test.go" )],
100+ py_binary (
101+ name = update_target ,
102+ srcs = [Label ("//manifest:copy_to_source.py" )],
103+ main = Label ("//manifest:copy_to_source.py" ),
104+ args = [
105+ "$(rootpath {})" .format (generated_manifest ),
106+ "$(rootpath {})" .format (manifest ),
107+ ],
110108 data = [
109+ generated_manifest ,
111110 manifest ,
112- requirements ,
113- manifest_generator_hash ,
114111 ],
115- rundir = "." ,
116- deps = [Label ("//manifest" )],
117- # kwargs could contain test-specific attributes like size or timeout
118- ** dict (attrs , ** kwargs )
112+ ** kwargs
119113 )
120114
115+ if requirements :
116+ attrs = {
117+ "env" : {
118+ "_TEST_MANIFEST" : "$(rootpath {})" .format (manifest ),
119+ "_TEST_MANIFEST_GENERATOR_HASH" : "$(rootpath {})" .format (manifest_generator_hash ),
120+ "_TEST_REQUIREMENTS" : "$(rootpath {})" .format (requirements ),
121+ },
122+ "size" : "small" ,
123+ }
124+ go_test (
125+ name = test_target ,
126+ srcs = [Label ("//manifest/test:test.go" )],
127+ data = [
128+ manifest ,
129+ requirements ,
130+ manifest_generator_hash ,
131+ ],
132+ rundir = "." ,
133+ deps = [Label ("//manifest" )],
134+ # kwargs could contain test-specific attributes like size or timeout
135+ ** dict (attrs , ** kwargs )
136+ )
137+ else :
138+ diff_test (
139+ name = test_target ,
140+ file1 = generated_manifest ,
141+ file2 = manifest ,
142+ failure_message = "Gazelle manifest is out of date. Run 'bazel run {}' to update it." .format (native .package_relative_label (update_target )),
143+ ** kwargs
144+ )
145+
121146 native .filegroup (
122147 name = name ,
123148 srcs = [manifest ],
0 commit comments