First draft "namespace path" named tuple; probably will discard

nspaths
Tyler Goodlet 2022-01-27 12:03:28 -05:00
parent 094206ee9d
commit 949cb2c9fe
1 changed files with 44 additions and 11 deletions

View File

@ -14,11 +14,13 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
""" '''
Memory boundary "Portals": an API for structured Memory boundary "Portals": an API for structured
concurrency linked tasks running in disparate memory domains. concurrency linked tasks running in disparate memory domains.
""" '''
from __future__ import annotations
from typing import NamedTuple
import importlib import importlib
import inspect import inspect
from typing import ( from typing import (
@ -66,11 +68,38 @@ async def maybe_open_nursery(
yield nursery yield nursery
def func_deats(func: Callable) -> tuple[str, str]: class NamespacePath(NamedTuple):
return ( '''
func.__module__, A serializeable description of a (function) object location
func.__name__, described by the target's module path and its namespace key.
)
'''
mod: str
key: str
def load(self) -> Callable:
return getattr(
importlib.import_module(self.mod),
self.key
)
@classmethod
def from_ref(
cls,
obj,
) -> NamespacePath:
return cls(
obj.__module__,
obj.__name__,
)
# def func_deats(func: Callable) -> NamespacePath[str, str]:
# return NamespacePath(
# func.__module__,
# func.__name__,
# )
def _unwrap_msg( def _unwrap_msg(
@ -86,6 +115,7 @@ def _unwrap_msg(
assert msg.get('cid'), "Received internal error at portal?" assert msg.get('cid'), "Received internal error at portal?"
raise unpack_error(msg, channel) raise unpack_error(msg, channel)
class MessagingError(Exception): class MessagingError(Exception):
'Some kind of unexpected SC messaging dialog issue' 'Some kind of unexpected SC messaging dialog issue'
@ -316,7 +346,8 @@ class Portal:
raise TypeError( raise TypeError(
f'{func} must be a non-streaming async function!') f'{func} must be a non-streaming async function!')
fn_mod_path, fn_name = func_deats(func) # fn_mod_path, fn_name = func_deats(func)
fn_mod_path, fn_name = NamespacePath.from_ref(func)
ctx = await self.actor.start_remote_task( ctx = await self.actor.start_remote_task(
self.channel, self.channel,
@ -346,7 +377,8 @@ class Portal:
raise TypeError( raise TypeError(
f'{async_gen_func} must be an async generator function!') f'{async_gen_func} must be an async generator function!')
fn_mod_path, fn_name = func_deats(async_gen_func) # fn_mod_path, fn_name = func_deats(async_gen_func)
fn_mod_path, fn_name = NamespacePath.from_ref(async_gen_func)
ctx = await self.actor.start_remote_task( ctx = await self.actor.start_remote_task(
self.channel, self.channel,
fn_mod_path, fn_mod_path,
@ -412,7 +444,8 @@ class Portal:
raise TypeError( raise TypeError(
f'{func} must be an async generator function!') f'{func} must be an async generator function!')
fn_mod_path, fn_name = func_deats(func) # fn_mod_path, fn_name = func_deats(func)
fn_mod_path, fn_name = NamespacePath.from_ref(func)
ctx = await self.actor.start_remote_task( ctx = await self.actor.start_remote_task(
self.channel, self.channel,
@ -430,7 +463,7 @@ class Portal:
first = msg['started'] first = msg['started']
ctx._started_called = True ctx._started_called = True
except KeyError as kerr: except KeyError:
assert msg.get('cid'), ("Received internal error at context?") assert msg.get('cid'), ("Received internal error at context?")
if msg.get('error'): if msg.get('error'):