From 2aac64f65cc8f270478db3bfc049706739f78ed5 Mon Sep 17 00:00:00 2001
From: timofey <tim@ongoteam.yaconnect.com>
Date: Fri, 2 Dec 2022 12:55:53 +0000
Subject: [PATCH] more match + less asserts

---
 ptvp35/__init__.py | 52 ++++++++++++++++++++++++++--------------------
 1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/ptvp35/__init__.py b/ptvp35/__init__.py
index 9de0da0..15342c6 100644
--- a/ptvp35/__init__.py
+++ b/ptvp35/__init__.py
@@ -6,9 +6,10 @@ import os
 import pathlib
 import threading
 import warnings
+from collections.abc import Hashable
 from functools import wraps
 from io import StringIO, UnsupportedOperation
-from typing import IO, Any, Callable, Hashable, TypeVar
+from typing import IO, Any, Callable, TypeVar
 
 __all__ = (
     'KVFactory',
@@ -140,16 +141,15 @@ class KVJson(KVFactory):
 
     def _load_key(self, key: Any, /) -> Hashable:
         """note: unstable signature."""
-        if isinstance(key, Hashable):
-            return key
-        elif isinstance(key, list):
-            return tuple(map(self._load_key, key))
-        elif isinstance(key, dict):
-            return tuple((self._load_key(k), self._load_key(v)) for k, v in key.items())
-        else:
-            raise TypeError(
-                'unknown KVJson key type, cannot convert to hashable'
-            )
+        match key:
+            case Hashable():
+                return key
+            case list():
+                return tuple(map(self._load_key, key))
+            case dict():
+                return tuple((self._load_key(k), self._load_key(v)) for k, v in key.items())
+            case _:
+                raise TypeError('unknown KVJson key type, cannot convert to hashable')
 
     def fromline(self, line: str, /) -> tuple[Any, Any]:
         d = json.loads(line)
@@ -207,7 +207,8 @@ def nightly(decorated: TDecoratedNightly = None, prefix: str = '', stacklevel=2)
             decorated.__init_subclass__, prefix, stacklevel=3
         )
         return decorated  # type: ignore
-    assert callable(decorated)
+    if not callable(decorated):
+        raise TypeError
 
     message = f"{prefix}{decorated.__name__}"
 
@@ -470,13 +471,14 @@ class DbConnection(VirtualConnection):
             await self._reload()
 
     async def _handle_request(self, request: Request, /) -> None:
-        if isinstance(request, LineRequest):
-            await self._write(request.line, request)
-        elif isinstance(request, CommitRequest):
-            await self._commit_buffer()
-            request.set_result(None)
-        else:
-            raise UnknownRequestType
+        match request:
+            case LineRequest():
+                await self._write(request.line, request)
+            case CommitRequest():
+                await self._commit_buffer()
+                request.set_result(None)
+            case _:
+                raise UnknownRequestType
 
     async def _background_cycle(self, /) -> None:
         request: Request = await self.__queue.get()
@@ -588,7 +590,8 @@ intended for heavy tasks."""
         self._start_task()
 
     async def _initialize(self, /) -> None:
-        assert self.__not_running
+        if not self.__not_running:
+            raise RuntimeError
         self.__not_running = False
         await self._initialize_running()
 
@@ -604,7 +607,8 @@ note: unstable signature."""
         await self._commit_buffer()
         if not self.__buffer_future.done():
             self.__buffer_future.set_exception(RequestToClosedConnection())
-            assert isinstance(self.__buffer_future.exception(), RequestToClosedConnection)
+            if not isinstance(self.__buffer_future.exception(), RequestToClosedConnection):
+                raise RuntimeError
         del self.__buffer_requested
         del self.__buffer_future
         del self.__buffer
@@ -614,7 +618,8 @@ note: unstable signature."""
             await self.__queue.join()
             self.__task.cancel()
             del self.__task
-        assert self.__queue.empty()
+        if not self.__queue.empty():
+            raise RuntimeError
         del self.__queue
         await self._close_buffer()
 
@@ -971,7 +976,8 @@ class Transaction:
         self.__running = False
 
     def __enter__(self) -> TransactionView:
-        assert not self.__running
+        if self.__running:
+            raise RuntimeError
         self.__running = True
         self.__view = TransactionView({}, self.__connection)
         return self.__view