36
36
# Service interface
37
37
#
38
38
class CallerReference (StrEnum ):
39
- IMPLEMENTATION = "implementation"
39
+ IMPLEMENTATION_WITHOUT_INTERFACE = "implementation-without-interface"
40
+ IMPLEMENTATION_OF_INTERFACE = "implementation-of-interface"
40
41
INTERFACE = "interface"
41
42
42
43
@@ -189,7 +190,7 @@ def __init__(
189
190
) -> None :
190
191
self .nexus_service = workflow .NexusClient (
191
192
service = {
192
- CallerReference .IMPLEMENTATION : MyServiceImpl ,
193
+ CallerReference .IMPLEMENTATION_OF_INTERFACE : MyServiceImpl ,
193
194
CallerReference .INTERFACE : MyServiceInterface ,
194
195
}[input .caller_reference ],
195
196
endpoint = make_nexus_endpoint_name (task_queue ),
@@ -237,7 +238,7 @@ def _get_operation(
237
238
(
238
239
SyncResponse ,
239
240
OpDefinitionType .SHORTHAND ,
240
- CallerReference .IMPLEMENTATION ,
241
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
241
242
): MyServiceImpl .my_sync_operation ,
242
243
(
243
244
SyncResponse ,
@@ -247,7 +248,7 @@ def _get_operation(
247
248
(
248
249
SyncResponse ,
249
250
OpDefinitionType .LONGHAND ,
250
- CallerReference .IMPLEMENTATION ,
251
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
251
252
): MyServiceImpl .my_sync_or_async_operation ,
252
253
(
253
254
SyncResponse ,
@@ -257,7 +258,7 @@ def _get_operation(
257
258
(
258
259
AsyncResponse ,
259
260
OpDefinitionType .SHORTHAND ,
260
- CallerReference .IMPLEMENTATION ,
261
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
261
262
): MyServiceImpl .my_async_operation ,
262
263
(
263
264
AsyncResponse ,
@@ -267,7 +268,7 @@ def _get_operation(
267
268
(
268
269
AsyncResponse ,
269
270
OpDefinitionType .LONGHAND ,
270
- CallerReference .IMPLEMENTATION ,
271
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
271
272
): MyServiceImpl .my_sync_or_async_operation ,
272
273
(
273
274
AsyncResponse ,
@@ -297,7 +298,8 @@ def _get_operation(
297
298
"op_definition_type" , [OpDefinitionType .SHORTHAND , OpDefinitionType .LONGHAND ]
298
299
)
299
300
@pytest .mark .parametrize (
300
- "caller_reference" , [CallerReference .IMPLEMENTATION , CallerReference .INTERFACE ]
301
+ "caller_reference" ,
302
+ [CallerReference .IMPLEMENTATION_OF_INTERFACE , CallerReference .INTERFACE ],
301
303
)
302
304
async def test_sync_response (
303
305
client : Client ,
@@ -343,7 +345,8 @@ async def test_sync_response(
343
345
"op_definition_type" , [OpDefinitionType .SHORTHAND , OpDefinitionType .LONGHAND ]
344
346
)
345
347
@pytest .mark .parametrize (
346
- "caller_reference" , [CallerReference .IMPLEMENTATION , CallerReference .INTERFACE ]
348
+ "caller_reference" ,
349
+ [CallerReference .IMPLEMENTATION_OF_INTERFACE , CallerReference .INTERFACE ],
347
350
)
348
351
async def test_async_response (
349
352
client : Client ,
@@ -469,13 +472,31 @@ class MyServiceInterfaceWithNameOverride:
469
472
my_op : nexusrpc .interface .Operation [None , str ]
470
473
471
474
475
+ @nexusrpc .handler .service
476
+ class MyServiceImplInterfaceWithNeitherInterfaceNorNameOverride :
477
+ @nexusrpc .handler .sync_operation
478
+ async def my_op (
479
+ self , input : None , options : nexusrpc .handler .StartOperationOptions
480
+ ) -> str :
481
+ return self .__class__ .__name__
482
+
483
+
472
484
@nexusrpc .handler .service (interface = MyServiceInterfaceWithoutNameOverride )
473
- class MyServiceImplWithoutNameOverride :
485
+ class MyServiceImplInterfaceWithoutNameOverride :
486
+ @nexusrpc .handler .sync_operation
487
+ async def my_op (
488
+ self , input : None , options : nexusrpc .handler .StartOperationOptions
489
+ ) -> str :
490
+ return self .__class__ .__name__
491
+
492
+
493
+ @nexusrpc .handler .service (interface = MyServiceInterfaceWithNameOverride )
494
+ class MyServiceImplInterfaceWithNameOverride :
474
495
@nexusrpc .handler .sync_operation
475
496
async def my_op (
476
497
self , input : None , options : nexusrpc .handler .StartOperationOptions
477
498
) -> str :
478
- return "from service impl with interface"
499
+ return self . __class__ . __name__
479
500
480
501
481
502
@nexusrpc .handler .service (name = "my-service-impl-🌈" )
@@ -484,7 +505,7 @@ class MyServiceImplWithNameOverride:
484
505
async def my_op (
485
506
self , input : None , options : nexusrpc .handler .StartOperationOptions
486
507
) -> str :
487
- return "from service impl with name override"
508
+ return self . __class__ . __name__
488
509
489
510
490
511
class NameOverride (StrEnum ):
@@ -511,13 +532,17 @@ async def run(
511
532
NameOverride .NO ,
512
533
): MyServiceInterfaceWithoutNameOverride ,
513
534
(
514
- CallerReference .IMPLEMENTATION ,
535
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
515
536
NameOverride .YES ,
516
537
): MyServiceImplWithNameOverride ,
517
538
(
518
- CallerReference .IMPLEMENTATION ,
539
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
519
540
NameOverride .NO ,
520
- ): MyServiceImplWithoutNameOverride ,
541
+ ): MyServiceImplInterfaceWithoutNameOverride ,
542
+ (
543
+ CallerReference .IMPLEMENTATION_WITHOUT_INTERFACE ,
544
+ NameOverride .NO ,
545
+ ): MyServiceImplInterfaceWithNeitherInterfaceNorNameOverride ,
521
546
}[caller_reference , name_override ]
522
547
nexus_client = workflow .NexusClient (
523
548
service = service_cls ,
@@ -532,12 +557,27 @@ async def run(
532
557
533
558
534
559
async def test_service_interface_and_implementation_names (client : Client ):
560
+ # Note that:
561
+ # - The caller can specify the service & operation via a reference to either the
562
+ # interface or implementation class.
563
+ # - An interface class may optionally override its name.
564
+ # - An implementation class may either override its name or specify an interface that
565
+ # it is implementing.
566
+ # - On registering a service implementation with a worker, the name by which the
567
+ # service is addressed in requests is the interface name if the implementation
568
+ # supplies one, or else the name override made by the impl class, or else the impl
569
+ # class name.
570
+ #
571
+ # This test checks that the request is routed to the expected service under a variety
572
+ # of the possible scenarios arising from the above.
535
573
task_queue = str (uuid .uuid4 ())
536
574
async with Worker (
537
575
client ,
538
576
nexus_services = [
539
- MyServiceImplWithoutNameOverride (),
540
577
MyServiceImplWithNameOverride (),
578
+ MyServiceImplInterfaceWithNameOverride (),
579
+ MyServiceImplInterfaceWithoutNameOverride (),
580
+ MyServiceImplInterfaceWithNeitherInterfaceNorNameOverride (),
541
581
],
542
582
workflows = [MyServiceInterfaceAndImplCallerWorkflow ],
543
583
task_queue = task_queue ,
@@ -551,7 +591,7 @@ async def test_service_interface_and_implementation_names(client: Client):
551
591
id = str (uuid .uuid4 ()),
552
592
task_queue = task_queue ,
553
593
)
554
- == "from service interface with name override "
594
+ == "MyServiceImplInterfaceWithNameOverride "
555
595
)
556
596
assert (
557
597
await client .execute_workflow (
@@ -560,25 +600,46 @@ async def test_service_interface_and_implementation_names(client: Client):
560
600
id = str (uuid .uuid4 ()),
561
601
task_queue = task_queue ,
562
602
)
563
- == "from service interface without name override"
603
+ == "MyServiceImplInterfaceWithoutNameOverride"
604
+ )
605
+ assert (
606
+ await client .execute_workflow (
607
+ MyServiceInterfaceAndImplCallerWorkflow .run ,
608
+ args = (
609
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
610
+ NameOverride .YES ,
611
+ task_queue ,
612
+ ),
613
+ id = str (uuid .uuid4 ()),
614
+ task_queue = task_queue ,
615
+ )
616
+ == "MyServiceImplWithNameOverride"
564
617
)
565
618
assert (
566
619
await client .execute_workflow (
567
620
MyServiceInterfaceAndImplCallerWorkflow .run ,
568
- args = (CallerReference .IMPLEMENTATION , NameOverride .YES , task_queue ),
621
+ args = (
622
+ CallerReference .IMPLEMENTATION_OF_INTERFACE ,
623
+ NameOverride .NO ,
624
+ task_queue ,
625
+ ),
569
626
id = str (uuid .uuid4 ()),
570
627
task_queue = task_queue ,
571
628
)
572
- == "from service impl with interface and name override "
629
+ == "MyServiceImplInterfaceWithoutNameOverride "
573
630
)
574
631
assert (
575
632
await client .execute_workflow (
576
633
MyServiceInterfaceAndImplCallerWorkflow .run ,
577
- args = (CallerReference .IMPLEMENTATION , NameOverride .NO , task_queue ),
634
+ args = (
635
+ CallerReference .IMPLEMENTATION_WITHOUT_INTERFACE ,
636
+ NameOverride .NO ,
637
+ task_queue ,
638
+ ),
578
639
id = str (uuid .uuid4 ()),
579
640
task_queue = task_queue ,
580
641
)
581
- == "from service impl with interface but without name override "
642
+ == "MyServiceImplInterfaceWithNeitherInterfaceNorNameOverride "
582
643
)
583
644
584
645
0 commit comments