replit-river 0.17.9.dev0__tar.gz → 0.17.11__tar.gz

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.
Files changed (141) hide show
  1. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/PKG-INFO +1 -1
  2. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/pyproject.toml +1 -1
  3. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/client_session.py +5 -0
  4. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/client.py +6 -2
  5. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/session.py +12 -3
  6. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.envrc +0 -0
  7. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.github/CODEOWNERS +0 -0
  8. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.github/pull_request_template.md +0 -0
  9. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.github/release-drafter.yml +0 -0
  10. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.github/workflows/ci.yml +0 -0
  11. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.github/workflows/python-publish.yml +0 -0
  12. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.github/workflows/release-drafter.yml +0 -0
  13. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.gitignore +0 -0
  14. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.python-version +0 -0
  15. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/.replit +0 -0
  16. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/LICENSE +0 -0
  17. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/Makefile +0 -0
  18. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/README.md +0 -0
  19. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/flake.lock +0 -0
  20. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/flake.nix +0 -0
  21. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/mypy.ini +0 -0
  22. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/py.typed +0 -0
  23. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/pyrightconfig.json +0 -0
  24. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/replit.nix +0 -0
  25. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/scripts/lint/README.md +0 -0
  26. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/scripts/lint/pyproject.toml +0 -0
  27. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/scripts/lint/src/lint/__init__.py +0 -0
  28. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/__init__.py +0 -0
  29. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/client.py +0 -0
  30. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/client_transport.py +0 -0
  31. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/__init__.py +0 -0
  32. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/__main__.py +0 -0
  33. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/format.py +0 -0
  34. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/run.py +0 -0
  35. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/schema.py +0 -0
  36. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/server.py +0 -0
  37. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/codegen/typing.py +0 -0
  38. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/common_session.py +0 -0
  39. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/error_schema.py +0 -0
  40. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/message_buffer.py +0 -0
  41. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/messages.py +0 -0
  42. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/py.typed +0 -0
  43. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/rate_limiter.py +0 -0
  44. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/rpc.py +0 -0
  45. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/seq_manager.py +0 -0
  46. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/server.py +0 -0
  47. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/server_session.py +0 -0
  48. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/server_transport.py +0 -0
  49. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/task_manager.py +0 -0
  50. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/transport_options.py +0 -0
  51. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/v2/__init__.py +0 -0
  52. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/v2/client.py +0 -0
  53. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/v2/client_transport.py +0 -0
  54. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/v2/session.py +0 -0
  55. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/src/replit_river/websocket_wrapper.py +0 -0
  56. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/__init__.py +0 -0
  57. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/conftest.py +0 -0
  58. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/fixtures/codegen_snapshot_fixtures.py +0 -0
  59. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/generated/__init__.py +0 -0
  60. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/generated/test_service/__init__.py +0 -0
  61. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/generated/test_service/rpc_method.py +0 -0
  62. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/generated_special_chars/__init__.py +0 -0
  63. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/generated_special_chars/test_service/__init__.py +0 -0
  64. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/generated_special_chars/test_service/rpc_method.py +0 -0
  65. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/input-collision-schema.json +0 -0
  66. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/input-special-chars-schema.json +0 -0
  67. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/invalid-schema.json +0 -0
  68. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/rpc/schema.json +0 -0
  69. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/parity/__init__.py +0 -0
  70. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/parity/check_parity.py +0 -0
  71. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/parity/gen.py +0 -0
  72. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/parity/schema.json +0 -0
  73. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/__init__.py +0 -0
  74. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/agentToolLanguageServer/__init__.py +0 -0
  75. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/agentToolLanguageServer/openDocument.py +0 -0
  76. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/aiExec/__init__.py +0 -0
  77. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/aiExec/exec.py +0 -0
  78. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/conmanFilesystem/__init__.py +0 -0
  79. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/conmanFilesystem/persist.py +0 -0
  80. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/replspaceApi/__init__.py +0 -0
  81. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/replspaceApi/init.py +0 -0
  82. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/shellExec/__init__.py +0 -0
  83. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/pydantic_inputs/shellExec/spawn.py +0 -0
  84. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/__init__.py +0 -0
  85. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/agentToolLanguageServer/__init__.py +0 -0
  86. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/agentToolLanguageServer/openDocument.py +0 -0
  87. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/aiExec/__init__.py +0 -0
  88. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/aiExec/exec.py +0 -0
  89. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/conmanFilesystem/__init__.py +0 -0
  90. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/conmanFilesystem/persist.py +0 -0
  91. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/replspaceApi/__init__.py +0 -0
  92. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/replspaceApi/init.py +0 -0
  93. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/shellExec/__init__.py +0 -0
  94. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/parity/typeddict_inputs/shellExec/spawn.py +0 -0
  95. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_basic_stream/__init__.py +0 -0
  96. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_basic_stream/test_service/__init__.py +0 -0
  97. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_basic_stream/test_service/emit_error.py +0 -0
  98. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_basic_stream/test_service/stream_method.py +0 -0
  99. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_pathological_types/__init__.py +0 -0
  100. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_pathological_types/test_service/__init__.py +0 -0
  101. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_pathological_types/test_service/pathological_method.py +0 -0
  102. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_unknown_enum/__init__.py +0 -0
  103. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_unknown_enum/enumService/__init__.py +0 -0
  104. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_unknown_enum/enumService/needsEnum.py +0 -0
  105. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/snapshots/test_unknown_enum/enumService/needsEnumObject.py +0 -0
  106. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/test_enum.py +0 -0
  107. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/snapshot/test_pathological.py +0 -0
  108. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/stream/schema.json +0 -0
  109. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/stream/test_stream.py +0 -0
  110. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/test_input_special_chars.py +0 -0
  111. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/test_invalid_schema.py +0 -0
  112. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/test_rpc.py +0 -0
  113. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/codegen/types/schema.json +0 -0
  114. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/common_handlers.py +0 -0
  115. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/river_fixtures/clientserver.py +0 -0
  116. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/river_fixtures/logging.py +0 -0
  117. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_communication.py +0 -0
  118. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_handshake.py +0 -0
  119. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_message_buffer.py +0 -0
  120. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_opentelemetry.py +0 -0
  121. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_rate_limiter.py +0 -0
  122. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_seq_manager.py +0 -0
  123. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v1/test_timeout.py +0 -0
  124. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_rpc/__init__.py +0 -0
  125. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_rpc/test_service/__init__.py +0 -0
  126. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_rpc/test_service/rpc_method.py +0 -0
  127. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_stream/__init__.py +0 -0
  128. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_stream/test_service/__init__.py +0 -0
  129. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_stream/test_service/emit_error.py +0 -0
  130. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/codegen/snapshot/snapshots/test_basic_stream/test_service/stream_method.py +0 -0
  131. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/datagrams.py +0 -0
  132. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/fixtures/bound_client.py +0 -0
  133. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/fixtures/raw_ws_server.py +0 -0
  134. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/interpreter.py +0 -0
  135. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/test_rpc.schema.json +0 -0
  136. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/test_stream.schema.json +0 -0
  137. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/test_v2_cancellation.py +0 -0
  138. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/test_v2_rpc.py +0 -0
  139. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/test_v2_session_lifecycle.py +0 -0
  140. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/tests/v2/test_v2_stream.py +0 -0
  141. {replit_river-0.17.9.dev0 → replit_river-0.17.11}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: replit-river
3
- Version: 0.17.9.dev0
3
+ Version: 0.17.11
4
4
  Summary: Replit river toolkit for Python
5
5
  Author-email: Replit <eng@replit.com>
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name="replit-river"
3
- version="0.17.9.dev0"
3
+ version="0.17.11"
4
4
  description="Replit river toolkit for Python"
5
5
  authors = [{ name = "Replit", email = "eng@replit.com" }]
6
6
  license = { file = "LICENSE" }
@@ -99,6 +99,8 @@ class ClientSession(Session):
99
99
  try:
100
100
  await self._handle_messages_from_ws()
101
101
  except ConnectionClosed:
102
+ if self._should_abort_streams_after_transport_failure():
103
+ await self.close()
102
104
  if self._retry_connection_callback:
103
105
  self._task_manager.create_task(self._retry_connection_callback())
104
106
 
@@ -106,10 +108,13 @@ class ClientSession(Session):
106
108
  logger.debug("ConnectionClosed while serving", exc_info=True)
107
109
  except FailedSendingMessageException:
108
110
  # Expected error if the connection is closed.
111
+ if self._should_abort_streams_after_transport_failure():
112
+ await self.close()
109
113
  logger.debug(
110
114
  "FailedSendingMessageException while serving", exc_info=True
111
115
  )
112
116
  except Exception:
117
+ await self.close()
113
118
  logger.exception("caught exception at message iterator")
114
119
  except ExceptionGroup as eg:
115
120
  _, unhandled = eg.split(lambda e: isinstance(e, ConnectionClosed))
@@ -405,7 +405,11 @@ def encode_type(
405
405
  | UnionTypeExpr
406
406
  | LiteralType
407
407
  ) = other
408
- raise ValueError(f"What does it mean to have {_o2} here?")
408
+ raise ValueError(
409
+ f"What does it mean to have {
410
+ render_type_expr(_o2)
411
+ } here?"
412
+ )
409
413
  if permit_unknown_members:
410
414
  union = _make_open_union_type_expr(any_of)
411
415
  else:
@@ -496,7 +500,7 @@ def encode_type(
496
500
  typeddict_encoder.append("None")
497
501
  return (NoneTypeExpr(), [], [], set())
498
502
  elif type.type == "Date":
499
- typeddict_encoder.append("TODO: dstewart")
503
+ typeddict_encoder.append("datetime.datetime")
500
504
  return (LiteralType("datetime.datetime"), [], [], set())
501
505
  elif type.type == "array" and type.items:
502
506
  type_name, module_info, type_chunks, encoder_names = encode_type(
@@ -286,6 +286,17 @@ class Session:
286
286
  if should_retry and self._retry_connection_callback:
287
287
  self._task_manager.create_task(self._retry_connection_callback())
288
288
 
289
+ def _should_abort_streams_after_transport_failure(self) -> bool:
290
+ return not self._transport_options.transparent_reconnect
291
+
292
+ def _abort_all_streams(self) -> None:
293
+ """Close all active stream channels, notifying any waiting consumers."""
294
+ if not self._streams:
295
+ return
296
+ for stream in self._streams.values():
297
+ stream.close()
298
+ self._streams.clear()
299
+
289
300
  async def close(self) -> None:
290
301
  """Close the session and all associated streams."""
291
302
  logger.info(
@@ -310,9 +321,7 @@ class Session:
310
321
 
311
322
  # TODO: unexpected_close should close stream differently here to
312
323
  # throw exception correctly.
313
- for stream in self._streams.values():
314
- stream.close()
315
- self._streams.clear()
324
+ self._abort_all_streams()
316
325
 
317
326
  self._state = SessionState.CLOSED
318
327