Skip to content

Commit 3909cc0

Browse files
A GooglerBlaze Rules Copybara
authored andcommitted
Accept a provider_name in TargetSubject.provider() and TargetSubject.has_provider()
PiperOrigin-RevId: 738381441
1 parent 52a6567 commit 3909cc0

File tree

3 files changed

+73
-10
lines changed

3 files changed

+73
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
### Changed
88

9-
* Nothing yet
9+
* `TargetSubject.provider()` and `TargetSubject.has_provider()` accept a
10+
`provider_name` for better error messaging.
1011

1112
### Added
1213

lib/private/target_subject.bzl

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,19 +175,20 @@ def _target_subject_failures(self):
175175
failure_messages = []
176176
return CollectionSubject.new(failure_messages, meta, container_name = "failure messages")
177177

178-
def _target_subject_has_provider(self, provider):
178+
def _target_subject_has_provider(self, provider, provider_name = "<Unknown provider>"):
179179
"""Asserts that the target as provider `provider`.
180180
181181
Method: TargetSubject.has_provider
182182
183183
Args:
184184
self: implicitly added.
185185
provider: The provider object to check for.
186+
provider_name: The display name of the provider
186187
"""
187188
if self.meta.has_provider(self.target, provider):
188189
return
189190
self.meta.add_failure(
190-
"expected to have provider: {}".format(_provider_subject_factory(self, provider).name),
191+
"expected to have provider: {}".format(_provider_subject_factory(self, provider, provider_name).name),
191192
"but provider was not found",
192193
)
193194

@@ -221,7 +222,7 @@ def _target_subject_output_group(self, name):
221222
meta = self.meta.derive("output_group({})".format(name)),
222223
)
223224

224-
def _target_subject_provider(self, provider_key, factory = None):
225+
def _target_subject_provider(self, provider_key, factory = None, provider_name = "<Unknown provider>"):
225226
"""Returns a subject for a provider in the target.
226227
227228
Method: TargetSubject.provider
@@ -235,20 +236,22 @@ def _target_subject_provider(self, provider_key, factory = None):
235236
signature: `def factory(value, /, *, meta)`.
236237
Additional types of providers can be pre-registered by using the
237238
`provider_subject_factories` arg of `analysis_test`.
239+
provider_name: The display name of the provider. This must be supplied
240+
separately because str(provider_key) just returns "<provider>",
241+
which isn't helpful. For lack of a better option, this defaults to
242+
<Unknown provider>.
238243
239244
Returns:
240245
A subject wrapper of the provider value.
241246
"""
242247
if factory:
243248
provider_subject_factory = struct(
244249
type = provider_key,
245-
# str(provider_key) just returns "<provider>", which isn't helpful.
246-
# For lack of a better option, just call it unknown
247-
name = "<Unknown provider>",
250+
name = provider_name,
248251
factory = factory,
249252
)
250253
else:
251-
provider_subject_factory = _provider_subject_factory(self, provider_key)
254+
provider_subject_factory = _provider_subject_factory(self, provider_key, provider_name)
252255

253256
if not provider_subject_factory.factory:
254257
fail("Unsupported provider: {}".format(provider_subject_factory.name))
@@ -392,14 +395,14 @@ def _target_subject_attr(self, name, *, factory = None):
392395
meta = self.meta.derive("attr({})".format(name)),
393396
)
394397

395-
def _provider_subject_factory(self, provider):
398+
def _provider_subject_factory(self, provider, provider_name = "<Unknown provider>"):
396399
for provider_subject_factory in self.meta.env.provider_subject_factories:
397400
if provider_subject_factory.type == provider:
398401
return provider_subject_factory
399402

400403
return struct(
401404
type = provider,
402-
name = "<Unknown provider>",
405+
name = provider_name,
403406
factory = None,
404407
)
405408

tests/truth_tests.bzl

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,62 @@ def _action_subject_test(env, target):
147147

148148
_suite.append(action_subject_test)
149149

150+
def provider_subject_test(name):
151+
analysis_test(name = name, impl = _provider_subject_test, target = "truth_tests_helper")
152+
153+
_UnusedInfo = provider("unused testing provider", fields = [])
154+
155+
def _provider_subject_test(env, target):
156+
fake_env = _fake_env(env)
157+
fake_env.expect.that_target(target).has_provider(_UnusedInfo)
158+
_assert_failure(
159+
fake_env,
160+
["expected to have provider: <Unknown provider>"],
161+
env = env,
162+
msg = "check has_provider() failure uses Unknown provider name",
163+
)
164+
165+
fake_env.expect.that_target(target).has_provider(_UnusedInfo, provider_name = "MyInfo")
166+
_assert_failure(
167+
fake_env,
168+
["expected to have provider: MyInfo"],
169+
env = env,
170+
msg = "check has_provider() failure uses supplied provider name",
171+
)
172+
173+
def _factory(_unused, meta):
174+
return struct(
175+
always_fails = lambda: meta.add_failure("Expected error msg", "Actual error msg"),
176+
)
177+
178+
fake_env.expect.that_target(target).provider(_TestHelperInfo, _factory).always_fails()
179+
_assert_failure(
180+
fake_env,
181+
[
182+
".provider(<Unknown provider>)",
183+
"Expected error msg",
184+
"Actual error msg",
185+
],
186+
env = env,
187+
msg = "check has_provider() failure uses Unknown provider name",
188+
)
189+
190+
fake_env.expect.that_target(target).provider(_TestHelperInfo, _factory, provider_name = "MyInfo").always_fails()
191+
_assert_failure(
192+
fake_env,
193+
[
194+
".provider(MyInfo)",
195+
"Expected error msg",
196+
"Actual error msg",
197+
],
198+
env = env,
199+
msg = "check provider() failure uses supplied provider name",
200+
)
201+
202+
_end(env, fake_env)
203+
204+
_suite.append(provider_subject_test)
205+
150206
def bool_subject_test(name):
151207
analysis_test(name = name, impl = _bool_subject_test, target = "truth_tests_helper")
152208

@@ -1589,6 +1645,8 @@ def _assert_failure(fake_env, expected_strs, *, env, msg = ""):
15891645

15901646
fake_env.reset()
15911647

1648+
_TestHelperInfo = provider("empty provider for testing", fields = [])
1649+
15921650
def _test_helper_impl(ctx):
15931651
action_output = ctx.actions.declare_file("action.txt")
15941652
generated_input = _empty_file(ctx, "input.gen.txt")
@@ -1627,6 +1685,7 @@ def _test_helper_impl(ctx):
16271685
OutputGroupInfo(
16281686
some_group = depset([_empty_file(ctx, "output_group_file.txt")]),
16291687
),
1688+
_TestHelperInfo(),
16301689
]
16311690

16321691
test_helper = rule(

0 commit comments

Comments
 (0)