Skip to content

Commit

Permalink
Merge pull request #13 from pomponchik/develop
Browse files Browse the repository at this point in the history
0.0.13
  • Loading branch information
pomponchik committed Apr 22, 2024
2 parents 6b6de51 + 4667230 commit 2f0f318
Show file tree
Hide file tree
Showing 6 changed files with 1,114 additions and 68 deletions.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,4 +228,13 @@ with escape(error_callback=lambda: print('Attention!')):
pass
```

If you pass a callback as a `before` parameter, it'll be called before the code block anyway:

```python
with escape(before=lambda: print('Attention!')):
pass
```

Notice, if an error occurs in this callback that will not be suppressed, the main code will not be executed - an exception will be raised before it starts executing.

If an error occurs in one of the callbacks, the exception will be suppressed if it would have been suppressed if it had happened in a wrapped code block or function. You can see the corresponding log entry about this if you [pass the logger object](#logging) for registration. If the error inside the callback has been suppressed, it will not affect the logic that was wrapped by `escape` in any way.
3 changes: 3 additions & 0 deletions escape/errors.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
class SetDefaultReturnValueForContextManagerError(Exception):
pass

class SetDefaultReturnValueForGeneratorFunctionError(Exception):
pass
4 changes: 2 additions & 2 deletions escape/proxy_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
muted_by_default_exceptions = (Exception, BaseExceptionGroup) # pragma: no cover

class ProxyModule(sys.modules[__name__].__class__): # type: ignore[misc]
def __call__(self, *args: Union[Callable[..., Any], Type[BaseException], EllipsisType], default: Any = None, logger: LoggerProtocol = EmptyLogger(), success_callback: Callable[[], Any] = lambda: None, error_callback: Callable[[], Any] = lambda: None, error_log_message: Optional[str] = None, success_log_message: Optional[str] = None, success_logging: bool = False) -> Union[Callable[..., Any], Callable[[Callable[..., Any]], Callable[..., Any]]]:
def __call__(self, *args: Union[Callable[..., Any], Type[BaseException], EllipsisType], default: Any = None, logger: LoggerProtocol = EmptyLogger(), success_callback: Callable[[], Any] = lambda: None, error_callback: Callable[[], Any] = lambda: None, before: Callable[[], Any] = lambda: None, error_log_message: Optional[str] = None, success_log_message: Optional[str] = None, success_logging: bool = False) -> Union[Callable[..., Any], Callable[[Callable[..., Any]], Callable[..., Any]]]:
"""
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
"""
Expand All @@ -32,7 +32,7 @@ def __call__(self, *args: Union[Callable[..., Any], Type[BaseException], Ellipsi
else:
exceptions = args # type: ignore[assignment]

wrapper_of_wrappers = Wrapper(default, exceptions, logger, success_callback, error_log_message, success_logging, success_log_message, error_callback)
wrapper_of_wrappers = Wrapper(default, exceptions, logger, success_callback, before, error_log_message, success_logging, success_log_message, error_callback)

if self.are_it_exceptions(args):
return wrapper_of_wrappers
Expand Down
15 changes: 13 additions & 2 deletions escape/wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,26 @@

from emptylog import LoggerProtocol

from escape.errors import SetDefaultReturnValueForContextManagerError
from escape.errors import SetDefaultReturnValueForContextManagerError, SetDefaultReturnValueForGeneratorFunctionError


class Wrapper:
def __init__(self, default: Any, exceptions: Tuple[Type[BaseException], ...], logger: LoggerProtocol, success_callback: Callable[[], Any], error_log_message: Optional[str], success_logging: bool, success_log_message: Optional[str], error_callback: Callable[[], Any]) -> None:
def __init__(self, default: Any, exceptions: Tuple[Type[BaseException], ...], logger: LoggerProtocol, success_callback: Callable[[], Any], before: Callable[[], Any], error_log_message: Optional[str], success_logging: bool, success_log_message: Optional[str], error_callback: Callable[[], Any]) -> None:
self.default: Any = default
self.exceptions: Tuple[Type[BaseException], ...] = exceptions
self.logger: LoggerProtocol = logger
self.success_callback: Callable[[], Any] = success_callback
self.error_callback: Callable[[], Any] = error_callback
self.before: Callable[[], Any] = before
self.error_log_message: Optional[str] = error_log_message
self.success_log_message: Optional[str] = success_log_message
self.success_logging: bool = success_logging

def __call__(self, function: Callable[..., Any]) -> Callable[..., Any]:
@wraps(function)
def wrapper(*args: Any, **kwargs: Any) -> Any:
self.run_callback(self.before)

result = None
success_flag = False

Expand Down Expand Up @@ -63,6 +66,8 @@ def wrapper(*args: Any, **kwargs: Any) -> Any:

@wraps(function)
async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
self.run_callback(self.before)

result = None
success_flag = False

Expand Down Expand Up @@ -103,6 +108,8 @@ async def async_wrapper(*args: Any, **kwargs: Any) -> Any:

@wraps(function)
def generator_wrapper(*args: Any, **kwargs: Any) -> Any:
self.run_callback(self.before)

result = None
success_flag = False

Expand Down Expand Up @@ -145,13 +152,17 @@ def generator_wrapper(*args: Any, **kwargs: Any) -> Any:
if iscoroutinefunction(function):
return async_wrapper
elif isgeneratorfunction(function):
if self.default is not None:
raise SetDefaultReturnValueForGeneratorFunctionError('You cannot set the default return value for the generator function. This is only possible for normal and coroutine functions.')
return generator_wrapper
return wrapper

def __enter__(self) -> 'Wrapper':
if self.default is not None:
raise SetDefaultReturnValueForContextManagerError('You cannot set a default value for the context manager. This is only possible for the decorator.')

self.run_callback(self.before)

return self

def __exit__(self, exception_type: Optional[Type[BaseException]], exception_value: Optional[BaseException], traceback: Optional[TracebackType]) -> bool:
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = 'setuptools.build_meta'

[project]
name = 'escaping'
version = '0.0.12'
version = '0.0.13'
authors = [
{ name='Evgeniy Blinov', email='zheni-b@yandex.ru' },
]
Expand Down

0 comments on commit 2f0f318

Please sign in to comment.