Files
zooqueenandHanzo Dev b144973bfc fix(lint): resolve all ruff + black errors across all packages
Fix 35 ruff errors (E722, F841, B904, B905, B007, E741, S202, S310,
S306, S110, TID251, UP042, F401) and run black on 526 files.

Co-authored-by: Hanzo Dev <[email protected]>
2026-02-21 23:32:32 -08:00

163 lines
3.5 KiB
Python

"""Hanzo Async - Unified async I/O for Hanzo AI.
High-performance async operations with uvloop backend and asyncio fallback.
Features:
- Automatic uvloop configuration (falls back to asyncio on Windows)
- Async file I/O (read, write, append, exists, mkdir)
- Async path operations (exists, is_file, is_dir, stat)
- Async subprocess execution
- Consistent patterns across all Hanzo packages
Usage:
from hanzo_async import read_file, write_file, path_exists, run_command
from hanzo_async import configure_loop, using_uvloop
# Check if using uvloop
if using_uvloop():
print("Using uvloop for high-performance async")
# Async file operations
content = await read_file("/path/to/file")
await write_file("/path/to/file", "content")
# Async path operations
if await path_exists("/path/to/file"):
...
# Async subprocess
stdout, stderr, code = await run_command("ls", "-la")
"""
import sys
import asyncio
from functools import lru_cache # noqa: TID251
# Track uvloop configuration state
_uvloop_configured = False
_using_uvloop = False
def configure_loop() -> bool:
"""Configure the event loop for high performance.
Uses uvloop on macOS/Linux, falls back to asyncio on Windows.
Safe to call multiple times - only configures once.
Returns:
True if uvloop is active, False if using asyncio fallback
"""
global _uvloop_configured, _using_uvloop
if _uvloop_configured:
return _using_uvloop
_uvloop_configured = True
# Windows doesn't support uvloop
if sys.platform == "win32":
_using_uvloop = False
return False
try:
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
_using_uvloop = True
return True
except ImportError:
_using_uvloop = False
return False
def using_uvloop() -> bool:
"""Check if uvloop is active.
Returns:
True if using uvloop, False if using asyncio
"""
if not _uvloop_configured:
configure_loop()
return _using_uvloop
def get_loop() -> asyncio.AbstractEventLoop:
"""Get the current event loop, creating if necessary.
Handles Python 3.10+ deprecation of get_event_loop() in non-async contexts.
Returns:
The current event loop
"""
try:
return asyncio.get_running_loop()
except RuntimeError:
# Not in async context, create new loop
if not _uvloop_configured:
configure_loop()
return asyncio.new_event_loop()
# Auto-configure on import
configure_loop()
# Export file operations
from hanzo_async.files import (
read_file,
read_json,
read_lines,
write_file,
write_json,
append_file,
write_lines,
)
# Export path operations
from hanzo_async.paths import (
glob,
stat,
mkdir,
rmdir,
is_dir,
unlink,
is_file,
listdir,
path_exists,
)
# Export process operations
from hanzo_async.process import (
run_shell,
run_command,
check_command,
)
__all__ = [
# Loop configuration
"configure_loop",
"using_uvloop",
"get_loop",
# File operations
"read_file",
"read_json",
"write_file",
"write_json",
"append_file",
"read_lines",
"write_lines",
# Path operations
"path_exists",
"is_file",
"is_dir",
"mkdir",
"rmdir",
"unlink",
"stat",
"listdir",
"glob",
# Process operations
"run_command",
"run_shell",
"check_command",
]