1616
1717load ("//python/private:text_util.bzl" , "render" )
1818
19- _RENDER = {
19+ # These are functions on how to render particular args, should be reused across all rendering
20+ # invocations to make things easier.
21+ _RENDER_FNS = {
2022 "copy_executables" : render .dict ,
2123 "copy_files" : render .dict ,
2224 "data" : render .list ,
@@ -29,6 +31,11 @@ _RENDER = {
2931 "srcs_exclude" : render .list ,
3032 "tags" : render .list ,
3133}
34+ def _render (** kwargs ):
35+ return {
36+ arg : _RENDER_FNS .get (arg , repr )(value )
37+ for arg , value in kwargs .items
38+ }
3239
3340# NOTE @aignas 2024-10-25: We have to keep this so that files in
3441# this repository can be publicly visible without the need for
@@ -38,19 +45,12 @@ _TEMPLATE = """\
3845
3946package(default_visibility = ["//visibility:public"])
4047
41- package_metadata(
42- name = "package_metadata",
43- purl = {purl},
44- visibility = ["//:__subpackages__"],
45- )
46-
47- {fn}(
48- {kwargs}
49- )
48+ {macros}
5049"""
5150
5251def generate_whl_library_build_bazel (
5352 * ,
53+ # TODO @aignas 2026-07-04: add extra args that are used in this function
5454 annotation = None ,
5555 config_load ,
5656 purl = None ,
@@ -72,21 +72,41 @@ def generate_whl_library_build_bazel(
7272
7373 loads = [
7474 """load("@package_metadata//rules:package_metadata.bzl", "package_metadata")""" ,
75+ """load("@rules_python//python/private/pypi:whl_library_targets.bzl", "whl_library_srcs", "whl_library_from_requires_dist")"""
7576 ]
7677
77- fn = "whl_library_targets_from_requires"
78- if not requires_dist :
79- # no deps, we can leave the extra loads out
80- pass
81- else :
82- loads .append ("""load("{}", "{}")""" .format (config_load , "packages" ))
83- kwargs ["include" ] = "packages"
84- kwargs ["requires_dist" ] = requires_dist
85-
86- loads .extend ([
87- """load("@rules_python//python/private/pypi:whl_library_targets.bzl", "{}")""" .format (fn ),
88- ])
78+ srcs_kwargs = dict (
79+ name = name ,
80+ data = [],
81+ sdist_filename = sdist_filename ,
82+ data_exclude = list (data_exclude ),
83+ srcs_exclude = list (srcs_exclude ),
84+ tags = [
85+ "pypi_name={}" .format (metadata_name ),
86+ "pypi_version={}" .format (metadata_version ),
87+ ],
88+ entry_points = entry_points ,
89+ enable_implicit_namespace_pkgs = enable_implicit_namespace_pkgs ,
90+ copy_files = copy_files ,
91+ copy_executables = copy_executables ,
92+ namespace_package_files = namespace_package_files ,
93+ data = [],
94+ visibility = visibility ,
95+ )
96+ from_requires_kwargs = dict (
97+ name = name ,
98+ metadata_name = metadata_name ,
99+ metadata_version = metadata_version ,
100+ requires_dist = requires_dist ,
101+ extras = extras ,
102+ group_deps = group_deps ,
103+ dep_template = dep_template ,
104+ group_name = group_name ,
105+ )
89106
107+ # NOTE, if users specify annotations, the wheel downloads are not reused this
108+ # is to ensure that we don't break users config and also to ensure that we
109+ # can have predictable results.
90110 additional_content = []
91111 if annotation :
92112 kwargs ["data" ] = annotation .data
@@ -97,19 +117,96 @@ def generate_whl_library_build_bazel(
97117 if annotation .additive_build_content :
98118 additional_content .append (annotation .additive_build_content )
99119
120+ macro_parts = [
121+ render .call (
122+ "package_metadata" ,
123+ ** _render (
124+ name = "package_metadata" ,
125+ purl = purl ,
126+ visibility = ["//:__subpackages__" ],
127+ ),
128+ ),
129+ render .call (
130+ "whl_library_srcs" ,
131+ ** _render (** srcs_kwargs )
132+ )
133+ ]
134+
135+ if config_load :
136+ loads .append ("""load("{}", "{}")""" .format (config_load , "packages" ))
137+ from_requires_kwargs ["include" ] = "packages"
138+
139+ macro_parts .append (render .call (
140+ "whl_library_from_requires_dist" ,
141+ ** _render (** from_requires_kwargs ),
142+ ))
143+
100144 contents = "\n " .join (
101145 [
102146 _TEMPLATE .format (
103147 loads = "\n " .join (loads ),
104- fn = fn ,
105- kwargs = render .indent ("\n " .join ([
106- "{} = {}," .format (k , _RENDER .get (k , repr )(v ))
107- for k , v in sorted (kwargs .items ())
108- ])),
109- purl = repr (purl ),
148+ macros = "\n \n " .join (macro_parts ),
110149 ),
111150 ] + additional_content ,
112151 )
113152
114153 # NOTE: Ensure that we terminate with a new line
115154 return contents .rstrip () + "\n "
155+
156+ def generate_whl_library_deps_build_bazel (
157+ * ,
158+ # TODO @aignas 2026-07-04: add extra args that are used in this function
159+ ** kwargs ):
160+ """Generate a BUILD file for an unzipped Wheel
161+
162+
163+ Returns:
164+ A complete BUILD file as a string
165+ """
166+
167+ loads = [
168+ """load("@rules_python//python/private/pypi:whl_library_targets.bzl", "whl_library_from_requires_dist")"""
169+ ]
170+
171+ from_requires_kwargs = dict (
172+ name = name ,
173+ metadata_name = metadata_name ,
174+ metadata_version = metadata_version ,
175+ requires_dist = requires_dist ,
176+ extras = extras ,
177+ group_deps = group_deps ,
178+ dep_template = dep_template ,
179+ group_name = group_name ,
180+ )
181+
182+ macro_parts = [
183+ render .call (
184+ "alias" ,
185+ name = target ,
186+ actual = whl_library .same_package_label (target ),
187+ )
188+ for target in [
189+ # TODO @aignas 2026-07-04: use ./labels.bzl for the following
190+ "package_metadata" ,
191+ "data" ,
192+ "dist_info" ,
193+ "extracted_whl_files" ,
194+ ]
195+ ]
196+
197+ if config_load :
198+ loads .append ("""load("{}", "{}")""" .format (config_load , "packages" ))
199+ from_requires_kwargs ["include" ] = "packages"
200+
201+ macro_parts .append (render .call (
202+ "whl_library_from_requires_dist" ,
203+ ** _render (** from_requires_kwargs ),
204+ ))
205+
206+ contents = _TEMPLATE .format (
207+ loads = "\n " .join (loads ),
208+ macros = "\n \n " .join (macro_parts ),
209+ )
210+
211+ # NOTE: Ensure that we terminate with a new line
212+ return contents .rstrip () + "\n "
0 commit comments