pydantic-rpc 0.14.0__py3-none-any.whl → 0.15.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pydantic_rpc/__init__.py CHANGED
@@ -15,6 +15,7 @@ from .decorators import (
15
15
  has_http_option,
16
16
  error_handler,
17
17
  get_error_handlers,
18
+ invoke_error_handler,
18
19
  )
19
20
  from .tls import (
20
21
  GrpcTLSConfig,
@@ -35,6 +36,7 @@ __all__ = [
35
36
  "has_http_option",
36
37
  "error_handler",
37
38
  "get_error_handlers",
39
+ "invoke_error_handler",
38
40
  "GrpcTLSConfig",
39
41
  "extract_peer_identity",
40
42
  "extract_peer_certificate_chain",
pydantic_rpc/core.py CHANGED
@@ -14,6 +14,8 @@ import types
14
14
  from collections.abc import AsyncIterator, Awaitable, Callable, Iterable, Sequence
15
15
  from concurrent import futures
16
16
  from connectrpc.code import Code as Errors
17
+ from connectrpc.errors import ConnectError
18
+
17
19
  # Protobuf Python modules for Timestamp, Duration (requires protobuf / grpcio)
18
20
  from google.protobuf import duration_pb2, timestamp_pb2, empty_pb2
19
21
  from grpc import ServicerContext
@@ -32,12 +34,17 @@ from typing import (
32
34
  get_origin,
33
35
  cast,
34
36
  TypeGuard,
37
+ Union,
38
+ Tuple,
35
39
  )
36
- from typing import Union
37
- from typing import Union, Sequence, Tuple
38
40
  from concurrent.futures import Executor
39
41
 
40
- from .decorators import get_method_options, has_http_option
42
+ from .decorators import (
43
+ get_method_options,
44
+ has_http_option,
45
+ get_error_handlers,
46
+ invoke_error_handler,
47
+ )
41
48
  from .tls import GrpcTLSConfig
42
49
 
43
50
  ###############################################################################
@@ -309,6 +316,116 @@ def generate_message_converter(
309
316
  return converter
310
317
 
311
318
 
319
+ def handle_validation_error_sync(
320
+ exc: ValidationError,
321
+ method: Callable,
322
+ context: Any,
323
+ request: Any = None,
324
+ is_grpc: bool = True,
325
+ ) -> Any:
326
+ """
327
+ Handle ValidationError with custom error handlers or default behavior (sync version).
328
+
329
+ Args:
330
+ exc: The ValidationError that was raised
331
+ method: The RPC method being called
332
+ context: The gRPC or Connect context
333
+ request: Optional raw request data
334
+ is_grpc: True for gRPC, False for Connect RPC
335
+
336
+ Returns:
337
+ Result of context.abort() call
338
+ """
339
+ error_handlers = get_error_handlers(method)
340
+
341
+ if error_handlers:
342
+ # Check if there's a handler for ValidationError
343
+ for handler_config in error_handlers:
344
+ if isinstance(exc, handler_config["exception_type"]):
345
+ if handler_config["handler"]:
346
+ # Custom handler function
347
+ try:
348
+ msg, _details = invoke_error_handler(
349
+ handler_config["handler"], exc, request
350
+ )
351
+ except Exception:
352
+ # Handler failed, fall back to default
353
+ msg = str(exc)
354
+ else:
355
+ # No custom handler, use default message
356
+ msg = str(exc)
357
+
358
+ # Use the configured status code
359
+ if is_grpc:
360
+ status_code = handler_config["status_code"]
361
+ return context.abort(status_code, msg)
362
+ else:
363
+ status_code = handler_config["connect_code"]
364
+ raise ConnectError(code=status_code, message=msg)
365
+
366
+ # No handler found, use default behavior
367
+ if is_grpc:
368
+ return context.abort(grpc.StatusCode.INVALID_ARGUMENT, str(exc))
369
+ else:
370
+ raise ConnectError(code=Errors.INVALID_ARGUMENT, message=str(exc))
371
+
372
+
373
+ async def handle_validation_error_async(
374
+ exc: ValidationError,
375
+ method: Callable,
376
+ context: Any,
377
+ request: Any = None,
378
+ is_grpc: bool = True,
379
+ ) -> Any:
380
+ """
381
+ Handle ValidationError with custom error handlers or default behavior (async version).
382
+
383
+ Args:
384
+ exc: The ValidationError that was raised
385
+ method: The RPC method being called
386
+ context: The gRPC or Connect context
387
+ request: Optional raw request data
388
+ is_grpc: True for gRPC, False for Connect RPC
389
+
390
+ Returns:
391
+ Result of context.abort() call
392
+ """
393
+ error_handlers = get_error_handlers(method)
394
+
395
+ if error_handlers:
396
+ # Check if there's a handler for ValidationError
397
+ for handler_config in error_handlers:
398
+ if isinstance(exc, handler_config["exception_type"]):
399
+ # Found a matching handler
400
+ if handler_config["handler"]:
401
+ # Custom handler function
402
+ try:
403
+ msg, _details = invoke_error_handler(
404
+ handler_config["handler"], exc, request
405
+ )
406
+ except Exception:
407
+ # Handler failed, fall back to default
408
+ msg = str(exc)
409
+ else:
410
+ # No custom handler, use default message
411
+ msg = str(exc)
412
+
413
+ # Use the configured status code
414
+ if is_grpc:
415
+ status_code = handler_config["status_code"]
416
+ await context.abort(status_code, msg)
417
+ return
418
+ else:
419
+ status_code = handler_config["connect_code"]
420
+ raise ConnectError(code=status_code, message=msg)
421
+
422
+ # No handler found, use default behavior
423
+ if is_grpc:
424
+ await context.abort(grpc.StatusCode.INVALID_ARGUMENT, str(exc))
425
+ else:
426
+ raise ConnectError(code=Errors.INVALID_ARGUMENT, message=str(exc))
427
+
428
+
312
429
  def python_value_to_proto_value(field_type: type[Any], value: Any) -> Any:
313
430
  """
314
431
  Converts Python values to protobuf values.
@@ -394,7 +511,9 @@ def connect_obj_with_stub(
394
511
  resp_obj, response_type, pb2_module
395
512
  )
396
513
  except ValidationError as e:
397
- return context.abort(grpc.StatusCode.INVALID_ARGUMENT, str(e))
514
+ return handle_validation_error_sync(
515
+ e, original, context, request, is_grpc=True
516
+ )
398
517
  except Exception as e:
399
518
  return context.abort(grpc.StatusCode.INTERNAL, str(e))
400
519
 
@@ -431,7 +550,9 @@ def connect_obj_with_stub(
431
550
  resp_obj, response_type, pb2_module
432
551
  )
433
552
  except ValidationError as e:
434
- return context.abort(grpc.StatusCode.INVALID_ARGUMENT, str(e))
553
+ return handle_validation_error_sync(
554
+ e, original, context, request, is_grpc=True
555
+ )
435
556
  except Exception as e:
436
557
  return context.abort(grpc.StatusCode.INTERNAL, str(e))
437
558
 
@@ -513,8 +634,8 @@ def connect_obj_with_stub_async(
513
634
  resp_obj, output_item_type, pb2_module
514
635
  )
515
636
  except ValidationError as e:
516
- await context.abort(
517
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
637
+ await handle_validation_error_async(
638
+ e, method, context, None, is_grpc=True
518
639
  )
519
640
  except Exception as e:
520
641
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -534,8 +655,8 @@ def connect_obj_with_stub_async(
534
655
  resp_obj, output_item_type, pb2_module
535
656
  )
536
657
  except ValidationError as e:
537
- await context.abort(
538
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
658
+ await handle_validation_error_async(
659
+ e, method, context, None, is_grpc=True
539
660
  )
540
661
  except Exception as e:
541
662
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -559,8 +680,8 @@ def connect_obj_with_stub_async(
559
680
  resp_obj, response_type, pb2_module
560
681
  )
561
682
  except ValidationError as e:
562
- await context.abort(
563
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
683
+ await handle_validation_error_async(
684
+ e, method, context, None, is_grpc=True
564
685
  )
565
686
  except Exception as e:
566
687
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -580,8 +701,8 @@ def connect_obj_with_stub_async(
580
701
  resp_obj, response_type, pb2_module
581
702
  )
582
703
  except ValidationError as e:
583
- await context.abort(
584
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
704
+ await handle_validation_error_async(
705
+ e, method, context, None, is_grpc=True
585
706
  )
586
707
  except Exception as e:
587
708
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -611,8 +732,8 @@ def connect_obj_with_stub_async(
611
732
  resp_obj, output_item_type, pb2_module
612
733
  )
613
734
  except ValidationError as e:
614
- await context.abort(
615
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
735
+ await handle_validation_error_async(
736
+ e, method, context, request, is_grpc=True
616
737
  )
617
738
  except Exception as e:
618
739
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -632,8 +753,8 @@ def connect_obj_with_stub_async(
632
753
  resp_obj, output_item_type, pb2_module
633
754
  )
634
755
  except ValidationError as e:
635
- await context.abort(
636
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
756
+ await handle_validation_error_async(
757
+ e, method, context, request, is_grpc=True
637
758
  )
638
759
  except Exception as e:
639
760
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -674,8 +795,8 @@ def connect_obj_with_stub_async(
674
795
  resp_obj, response_type, pb2_module
675
796
  )
676
797
  except ValidationError as e:
677
- await context.abort(
678
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
798
+ await handle_validation_error_async(
799
+ e, method, context, request, is_grpc=True
679
800
  )
680
801
  except Exception as e:
681
802
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -709,8 +830,8 @@ def connect_obj_with_stub_async(
709
830
  resp_obj, response_type, pb2_module
710
831
  )
711
832
  except ValidationError as e:
712
- await context.abort(
713
- grpc.StatusCode.INVALID_ARGUMENT, str(e)
833
+ await handle_validation_error_async(
834
+ e, method, context, request, is_grpc=True
714
835
  )
715
836
  except Exception as e:
716
837
  await context.abort(grpc.StatusCode.INTERNAL, str(e))
@@ -769,9 +890,11 @@ def connect_obj_with_stub_connect_python(
769
890
  resp_obj, response_type, pb2_module
770
891
  )
771
892
  except ValidationError as e:
772
- return context.abort(Errors.INVALID_ARGUMENT, str(e))
893
+ return handle_validation_error_sync(
894
+ e, method, context, request, is_grpc=False
895
+ )
773
896
  except Exception as e:
774
- return context.abort(Errors.INTERNAL, str(e))
897
+ raise ConnectError(code=Errors.INTERNAL, message=str(e))
775
898
 
776
899
  return stub_method0
777
900
 
@@ -798,9 +921,11 @@ def connect_obj_with_stub_connect_python(
798
921
  resp_obj, response_type, pb2_module
799
922
  )
800
923
  except ValidationError as e:
801
- return context.abort(Errors.INVALID_ARGUMENT, str(e))
924
+ return handle_validation_error_sync(
925
+ e, method, context, request, is_grpc=False
926
+ )
802
927
  except Exception as e:
803
- return context.abort(Errors.INTERNAL, str(e))
928
+ raise ConnectError(code=Errors.INTERNAL, message=str(e))
804
929
 
805
930
  return stub_method1
806
931
 
@@ -827,9 +952,11 @@ def connect_obj_with_stub_connect_python(
827
952
  resp_obj, response_type, pb2_module
828
953
  )
829
954
  except ValidationError as e:
830
- return context.abort(Errors.INVALID_ARGUMENT, str(e))
955
+ return handle_validation_error_sync(
956
+ e, method, context, request, is_grpc=False
957
+ )
831
958
  except Exception as e:
832
- return context.abort(Errors.INTERNAL, str(e))
959
+ raise ConnectError(code=Errors.INTERNAL, message=str(e))
833
960
 
834
961
  return stub_method2
835
962
 
@@ -889,9 +1016,11 @@ def connect_obj_with_stub_async_connect_python(
889
1016
  resp_obj, response_type, pb2_module
890
1017
  )
891
1018
  except ValidationError as e:
892
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1019
+ await handle_validation_error_async(
1020
+ e, method, context, request, is_grpc=False
1021
+ )
893
1022
  except Exception as e:
894
- await context.abort(Errors.INTERNAL, str(e))
1023
+ raise ConnectError(code=Errors.INTERNAL, message=str(e))
895
1024
 
896
1025
  return stub_method0
897
1026
 
@@ -931,9 +1060,13 @@ def connect_obj_with_stub_async_connect_python(
931
1060
  resp_obj, output_item_type, pb2_module
932
1061
  )
933
1062
  except ValidationError as e:
934
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1063
+ await handle_validation_error_async(
1064
+ e, method, context, None, is_grpc=False
1065
+ )
935
1066
  except Exception as e:
936
- await context.abort(Errors.INTERNAL, str(e))
1067
+ raise ConnectError(
1068
+ code=Errors.INTERNAL, message=str(e)
1069
+ )
937
1070
  else: # size_of_parameters == 2
938
1071
 
939
1072
  async def stub_method(
@@ -949,9 +1082,13 @@ def connect_obj_with_stub_async_connect_python(
949
1082
  resp_obj, output_item_type, pb2_module
950
1083
  )
951
1084
  except ValidationError as e:
952
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1085
+ await handle_validation_error_async(
1086
+ e, method, context, None, is_grpc=False
1087
+ )
953
1088
  except Exception as e:
954
- await context.abort(Errors.INTERNAL, str(e))
1089
+ raise ConnectError(
1090
+ code=Errors.INTERNAL, message=str(e)
1091
+ )
955
1092
 
956
1093
  return stub_method
957
1094
  else:
@@ -973,9 +1110,13 @@ def connect_obj_with_stub_async_connect_python(
973
1110
  resp_obj, response_type, pb2_module
974
1111
  )
975
1112
  except ValidationError as e:
976
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1113
+ await handle_validation_error_async(
1114
+ e, method, context, None, is_grpc=False
1115
+ )
977
1116
  except Exception as e:
978
- await context.abort(Errors.INTERNAL, str(e))
1117
+ raise ConnectError(
1118
+ code=Errors.INTERNAL, message=str(e)
1119
+ )
979
1120
  else: # size_of_parameters == 2
980
1121
 
981
1122
  async def stub_method(
@@ -993,9 +1134,13 @@ def connect_obj_with_stub_async_connect_python(
993
1134
  resp_obj, response_type, pb2_module
994
1135
  )
995
1136
  except ValidationError as e:
996
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1137
+ await handle_validation_error_async(
1138
+ e, method, context, None, is_grpc=False
1139
+ )
997
1140
  except Exception as e:
998
- await context.abort(Errors.INTERNAL, str(e))
1141
+ raise ConnectError(
1142
+ code=Errors.INTERNAL, message=str(e)
1143
+ )
999
1144
 
1000
1145
  return stub_method
1001
1146
  else:
@@ -1024,9 +1169,13 @@ def connect_obj_with_stub_async_connect_python(
1024
1169
  resp_obj, output_item_type, pb2_module
1025
1170
  )
1026
1171
  except ValidationError as e:
1027
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1172
+ await handle_validation_error_async(
1173
+ e, method, context, request, is_grpc=False
1174
+ )
1028
1175
  except Exception as e:
1029
- await context.abort(Errors.INTERNAL, str(e))
1176
+ raise ConnectError(
1177
+ code=Errors.INTERNAL, message=str(e)
1178
+ )
1030
1179
  else: # size_of_parameters == 2
1031
1180
 
1032
1181
  async def stub_method(
@@ -1045,9 +1194,13 @@ def connect_obj_with_stub_async_connect_python(
1045
1194
  resp_obj, output_item_type, pb2_module
1046
1195
  )
1047
1196
  except ValidationError as e:
1048
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1197
+ await handle_validation_error_async(
1198
+ e, method, context, request, is_grpc=False
1199
+ )
1049
1200
  except Exception as e:
1050
- await context.abort(Errors.INTERNAL, str(e))
1201
+ raise ConnectError(
1202
+ code=Errors.INTERNAL, message=str(e)
1203
+ )
1051
1204
 
1052
1205
  return stub_method
1053
1206
  else:
@@ -1074,9 +1227,13 @@ def connect_obj_with_stub_async_connect_python(
1074
1227
  resp_obj, response_type, pb2_module
1075
1228
  )
1076
1229
  except ValidationError as e:
1077
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1230
+ await handle_validation_error_async(
1231
+ e, method, context, request, is_grpc=False
1232
+ )
1078
1233
  except Exception as e:
1079
- await context.abort(Errors.INTERNAL, str(e))
1234
+ raise ConnectError(
1235
+ code=Errors.INTERNAL, message=str(e)
1236
+ )
1080
1237
  else: # size_of_parameters == 2
1081
1238
 
1082
1239
  async def stub_method(
@@ -1099,9 +1256,13 @@ def connect_obj_with_stub_async_connect_python(
1099
1256
  resp_obj, response_type, pb2_module
1100
1257
  )
1101
1258
  except ValidationError as e:
1102
- await context.abort(Errors.INVALID_ARGUMENT, str(e))
1259
+ await handle_validation_error_async(
1260
+ e, method, context, request, is_grpc=False
1261
+ )
1103
1262
  except Exception as e:
1104
- await context.abort(Errors.INTERNAL, str(e))
1263
+ raise ConnectError(
1264
+ code=Errors.INTERNAL, message=str(e)
1265
+ )
1105
1266
 
1106
1267
  return stub_method
1107
1268
 
@@ -2811,12 +2972,13 @@ class AsyncIOServer:
2811
2972
  await self._server.start()
2812
2973
 
2813
2974
  shutdown_event = asyncio.Event()
2975
+ loop = asyncio.get_running_loop()
2814
2976
 
2815
2977
  def shutdown(signum: signal.Signals, frame: Any):
2816
2978
  _ = signum
2817
2979
  _ = frame
2818
2980
  print("Received shutdown signal...")
2819
- shutdown_event.set()
2981
+ loop.call_soon_threadsafe(shutdown_event.set)
2820
2982
 
2821
2983
  for s in [signal.SIGTERM, signal.SIGINT]:
2822
2984
  _ = signal.signal(s, shutdown) # pyright:ignore[reportArgumentType]
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import Any, Callable, Dict, List, Optional, TypeVar, Type
4
4
  from functools import wraps
5
+ import inspect
5
6
  import grpc
6
7
  from connectrpc.code import Code as ConnectErrors
7
8
 
@@ -145,7 +146,10 @@ def error_handler(
145
146
  exception_type: Type[Exception],
146
147
  status_code: Optional[grpc.StatusCode] = None,
147
148
  connect_code: Optional[ConnectErrors] = None,
148
- handler: Optional[Callable[[Exception], tuple[str, Any]]] = None,
149
+ handler: Optional[
150
+ Callable[[Exception], tuple[str, Any]]
151
+ | Callable[[Exception, Any], tuple[str, Any]]
152
+ ] = None,
149
153
  ) -> Callable[[F], F]:
150
154
  """
151
155
  Decorator to add automatic error handling to an RPC method.
@@ -154,13 +158,22 @@ def error_handler(
154
158
  exception_type: The type of exception to handle
155
159
  status_code: The gRPC status code to return (for gRPC services)
156
160
  connect_code: The Connect error code to return (for Connect services)
157
- handler: Optional custom handler function that returns (message, details)
161
+ handler: Optional custom handler function that returns (message, details).
162
+ Can accept either (exception) or (exception, request_data) as parameters.
158
163
 
159
164
  Example:
160
165
  @error_handler(ValidationError, status_code=grpc.StatusCode.INVALID_ARGUMENT)
161
166
  @error_handler(KeyError, status_code=grpc.StatusCode.NOT_FOUND)
162
167
  async def get_user(self, request: GetUserRequest) -> User:
163
168
  ...
169
+
170
+ # With custom handler that accesses request data
171
+ def validation_handler(exc: ValidationError, request_data: Any) -> tuple[str, dict]:
172
+ return f"Validation failed for {request_data}", {"errors": exc.errors()}
173
+
174
+ @error_handler(ValidationError, handler=validation_handler)
175
+ async def create_user(self, request: CreateUserRequest) -> User:
176
+ ...
164
177
  """
165
178
 
166
179
  def decorator(func: F) -> F:
@@ -180,18 +193,11 @@ def error_handler(
180
193
  }
181
194
  )
182
195
 
183
- @wraps(func)
184
- def wrapper(*args, **kwargs):
185
- return func(*args, **kwargs)
186
-
187
- # Preserve the error handlers on the wrapper
188
- setattr(wrapper, ERROR_HANDLER_ATTR, handlers)
196
+ # Set the error handlers directly on the function
197
+ # No need for a wrapper - we're just storing metadata
198
+ setattr(func, ERROR_HANDLER_ATTR, handlers)
189
199
 
190
- # Preserve any existing option metadata
191
- if hasattr(func, OPTION_METADATA_ATTR):
192
- setattr(wrapper, OPTION_METADATA_ATTR, getattr(func, OPTION_METADATA_ATTR))
193
-
194
- return wrapper # type: ignore
200
+ return func # type: ignore
195
201
 
196
202
  return decorator
197
203
 
@@ -207,3 +213,31 @@ def get_error_handlers(method: Callable) -> Optional[List[Dict[str, Any]]]:
207
213
  List of error handler configurations if present, None otherwise
208
214
  """
209
215
  return getattr(method, ERROR_HANDLER_ATTR, None)
216
+
217
+
218
+ def invoke_error_handler(
219
+ handler_func: Callable, exception: Exception, request_data: Any = None
220
+ ) -> tuple[str, Any]:
221
+ """
222
+ Invoke an error handler function with appropriate parameters based on its signature.
223
+
224
+ Args:
225
+ handler_func: The error handler function to invoke
226
+ exception: The exception that was raised
227
+ request_data: Optional request data (raw protobuf request)
228
+
229
+ Returns:
230
+ Tuple of (error_message, error_details)
231
+ """
232
+ sig = inspect.signature(handler_func)
233
+ param_count = len(sig.parameters)
234
+
235
+ if param_count == 1:
236
+ # Handler only accepts exception
237
+ return handler_func(exception)
238
+ elif param_count == 2:
239
+ # Handler accepts exception and request_data
240
+ return handler_func(exception, request_data)
241
+ else:
242
+ # Invalid signature, fall back to exception only
243
+ return handler_func(exception)
@@ -1,8 +1,12 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pydantic-rpc
3
- Version: 0.14.0
3
+ Version: 0.15.1
4
4
  Summary: A Python library for building gRPC/ConnectRPC services with Pydantic models.
5
5
  Author: Yasushi Itoh
6
+ Classifier: Programming Language :: Python :: 3.11
7
+ Classifier: Programming Language :: Python :: 3.12
8
+ Classifier: Programming Language :: Python :: 3.13
9
+ Classifier: Programming Language :: Python :: 3.14
6
10
  Requires-Dist: annotated-types==0.7.0
7
11
  Requires-Dist: pydantic>=2.1.1
8
12
  Requires-Dist: grpcio>=1.56.2
@@ -1,12 +1,12 @@
1
- pydantic_rpc/__init__.py,sha256=c5e0b5d4ed6de3e3c7c1ada5389e704ce149ea56ca0930392db6abdf222b4e86,871
2
- pydantic_rpc/core.py,sha256=422cbccacdf857e0c1d29e04784562de1bc47764d0f464b1086cceb7a3719c70,115689
3
- pydantic_rpc/decorators.py,sha256=94d87825e034b6303df46dd74e6c8c7ed5c88133aa504d61249a83dbf82f1de3,6219
1
+ pydantic_rpc/__init__.py,sha256=1b57454e64c68891868ea3993af9e11100c579b56af99f4aa0f836934ddf883d,925
2
+ pydantic_rpc/core.py,sha256=d7cc8d95425361bd7a63c0eee7d90f9e759067f1d959dfa67c1e15aa73697495,121896
3
+ pydantic_rpc/decorators.py,sha256=3ee29ded407c888793694452f0b32fbcf46aedd09b42275a2eedaffda9e0e5f4,7465
4
4
  pydantic_rpc/mcp/__init__.py,sha256=f05ad62cc38db5c5972e16870c484523c58c5ac650d8454706f1ce4539cc7a52,123
5
5
  pydantic_rpc/mcp/converter.py,sha256=b60dcaf82e6bff6be4b2ab8b1e9f2d16e09cb98d8f00182a4f6f73d1a78848a4,4158
6
6
  pydantic_rpc/mcp/exporter.py,sha256=20833662f9a973ed9e1a705b9b59aaa2533de6c514ebd87ef66664a430a0d04f,10239
7
7
  pydantic_rpc/options.py,sha256=6094036184a500b92715fd91d31ecc501460a56de47dcf6024c6335ae8e5d6e3,4561
8
8
  pydantic_rpc/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
9
9
  pydantic_rpc/tls.py,sha256=0eb290cc09c8ebedc71e7a97c01736d9675a314f70ebd80a2ce73e3f1689d359,3567
10
- pydantic_rpc-0.14.0.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
11
- pydantic_rpc-0.14.0.dist-info/METADATA,sha256=d2ea2414284c138bb9eb0f47fb63ff282bd4aa4e915c1ad9cc08d1840fa57ea1,35957
12
- pydantic_rpc-0.14.0.dist-info/RECORD,,
10
+ pydantic_rpc-0.15.1.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
11
+ pydantic_rpc-0.15.1.dist-info/METADATA,sha256=2606ce6f0ca5e7ce38c3292d1c1a9c9f8a6797094594c186df876eb897f79d14,36161
12
+ pydantic_rpc-0.15.1.dist-info/RECORD,,