diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index e85e561f..dac7b18f 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.12", "3.13"] + python-version: ["3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2184ab4d..d2a921a9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,10 +20,10 @@ jobs: # newest at run time. Confirmed 2026-08-19: it silently picked up # 3.14.7 for the v6.1.0 release run and 37 tests/micro-tests/my_profile # (Textual TUI) tests failed with `assert task is not None` inside - # textual/rlock.py -- Textual's RLock breaks under 3.14. The full - # suite passes clean on 3.13.7 (this repo's actual dev/verification - # version), so pin to 3.13 until Textual's 3.14 compatibility is - # confirmed separately. + # textual/rlock.py. The cause was nest_asyncio (applied at pyegeria + # import time), which makes asyncio.current_task() return None on 3.14; + # ISSUE-168 removed it and python-tests.yml now covers 3.14. Releases + # stay on 3.13, this repo's dev/verification version. run: uv python install 3.13 - name: Install dependencies run: uv sync --all-extras --dev -p 3.13 diff --git a/AGENTS.md b/AGENTS.md index e53558d5..c83f1878 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,8 +22,10 @@ - `pyegeria/core/_base_platform_client.py` → `_base_server_client.py` → `_server_client.py`: layered transport/auth/GUID-resolution stack used by all OMVS clients. - **httpx session** (`_base_platform_client.py`): `AsyncClient` is created with `keepalive_expiry=20 s`, `connect` timeout 10 s, and pool limits (`max_connections=10`, `max_keepalive_connections=5`). These settings are load-bearing for long-running sessions behind reverse proxies — do not remove them. - **401 auto-refresh**: `_async_make_request` checks for a 401/403 before calling `raise_for_status()` and, if `token_src == "Egeria"`, calls `_async_refresh_egeria_bearer_token()` and retries once (`_retrying=True` guards against loops). Externally-supplied tokens (via `set_bearer_token`) are not auto-refreshed. - - **`__exit__` is async-aware**: uses `loop.run_until_complete(self.session.aclose())` — `aclose()` is a coroutine and must be awaited. Never revert to a bare `self.session.aclose()` call. - - **Async context rule**: `create_egeria_bearer_token()` (sync) calls `run_until_complete` internally and raises `RuntimeError` if called from a running event loop. Always use `await client._async_create_egeria_bearer_token()` inside async routes or coroutines. + - **Sync wrappers use `run_sync`** (`pyegeria/core/async_runner.py`, ISSUE-168): with no loop running it uses a per-thread persistent loop; inside a running loop it runs the coroutine on the `pyegeria-sync-runner` background thread and blocks. So sync methods work in Jupyter and async apps without `nest_asyncio` (which pyegeria no longer applies; it breaks asyncio on Python 3.14). Never use `asyncio.run` or `get_event_loop().run_until_complete` in library code; `tests/micro-tests/test_async_runner.py` enforces this. + - **The httpx session is per thread and per loop**: the `session` property opens a new `AsyncClient` when the calling thread's running loop changes, unless a session was set explicitly (pinned). + - **`__exit__` is async-aware**: uses `run_sync(self.session.aclose())` — `aclose()` is a coroutine and must be awaited. Never revert to a bare `self.session.aclose()` call. + - **Async context rule**: inside coroutines and async routes, `await client._async_*` (including `_async_create_egeria_bearer_token()` and `_async_close_session()`). The sync forms work there but block the event loop until Egeria answers. - `pyegeria/core/config.py`: Pydantic-settings–based config; precedence = explicit args > OS env > `.env` > `config.json` > defaults. - `pyegeria/egeria_tech_client.py`: lazy facade (`__getattr__`) across OMVS subclients; token propagation happens via `set_bearer_token()`. - `pyegeria/egeria_client.py` (`Egeria`) / `pyegeria/egeria_cat_client.py` (`EgeriaCat`): additional role-based facades; `EgeriaCat` uses MI over `ProjectManager`, `GlossaryManager`, `AssetCatalog`, `MyProfile`. @@ -72,7 +74,7 @@ - See `High-signal rules` for async-wrapper, snake_case param, and lazy-loading requirements. ## High-signal rules (verbatim) -- [HIGH SIGNAL] New OMVS operations should follow async-core + sync-wrapper pattern (`_async_*` + public sync method). +- [HIGH SIGNAL] New OMVS operations should follow async-core + sync-wrapper pattern (`_async_*` + public sync method); the wrapper calls `run_sync(self._async_*(...))`. - [HIGH SIGNAL] Keep CLI/report params in snake_case (`page_size`, `start_from`); adapters handle wire camelCase. - [HIGH SIGNAL] Preserve lazy-loading behavior in facade clients; do not eagerly instantiate all subclients unless clearly justified. - [HIGH SIGNAL] For config-sensitive changes, respect precedence: explicit args > env vars > `.env` > JSON config > defaults. diff --git a/CLAUDE.md b/CLAUDE.md index b85a090c..faa90cd9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -259,7 +259,7 @@ Changes to `pyegeria/` (SDK API, config, report formatting) can break both. - **Gotcha — a request-body Pydantic model (`pyegeria/models/models.py`) missing a field silently drops it, not an error.** Every model inherits `PyegeriaModel`'s `extra='ignore'`, so a caller-supplied dict (or a raw no-body-provided construction in `_server_client.py`'s `validate_delete_*_request`-style helpers) with a field the model doesn't declare validates successfully and just vanishes before serialization — no exception, no warning. Confirmed live impact: `DeleteElementRequestBody` had neither a cascade field nor `deleteMethod` for a long time — every caller passing `cascade_delete=True` through `_async_delete_element_request` had silently been sending it as unset (PYEGERIA_ISSUES.md ISSUE-62). The same thing happens on the server side: Egeria's DTOs ignore unknown fields too, so a misspelled name is dropped there. The ISSUE-62 fix chose `cascadeDelete` from the `.http` files, but Egeria's real field is `cascadedDelete` (`DeleteOptions.java`), so cascade still never reached the server (ISSUE-132, on hold for an Egeria fix). When adding/using a request-body model, check its fields against the Egeria Java DTO (or at least `pyegeria/http-clients/Egeria-api-*.http`, knowing it can be wrong) rather than assuming "it validated without error" means the field will actually be sent and read. **`pyegeria/omvs/`** — 40+ service-specific clients (one file per OMVS) -- Every public method has an `_async_*` implementation and a sync wrapper calling `asyncio.get_event_loop().run_until_complete(...)`. +- Every public method has an `_async_*` implementation and a sync wrapper calling `run_sync(self._async_x(...))` (`pyegeria/core/async_runner.py`). Never write `asyncio.run(...)` or `asyncio.get_event_loop().run_until_complete(...)` in a wrapper: both fail inside a running loop (Jupyter, Textual) now that pyegeria doesn't apply `nest_asyncio` (ISSUE-168), and `test_async_runner.py` fails on either in `pyegeria/` or `md_processing/` outside a `__main__` block. - All public methods decorated with `@dynamic_catch`. - The reference for API URLs and request bodies is `pyegeria/http-clients/Egeria-api-*.http` — check these files before constructing URLs, and confirm anything decision-critical against Egeria's Java source (see "Auditing the OMVS clients" above). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 43356571..47787406 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,17 @@ We use `uv` for dependency management. To set up your environment: ### Sync and Async Every new OMVS method should provide both an `async` version (prefixed with `_async_`) and a synchronous wrapper. This ensures compatibility with both high-performance applications and interactive Jupyter notebooks. +The wrapper calls `run_sync` from `pyegeria.core.async_runner`: + +```python +@dynamic_catch +def find_widgets(self, search_string: str = "*", ...) -> list | str: + """Find widgets. See `_async_find_widgets`.""" + return run_sync(self._async_find_widgets(search_string, ...)) +``` + +Don't use `asyncio.run(...)` or `asyncio.get_event_loop().run_until_complete(...)`. Both fail when the caller already has a running event loop (Jupyter, Textual, FastAPI), and `tests/micro-tests/test_async_runner.py` fails if either appears in `pyegeria/` or `md_processing/`. See [Sync and async](docs/user_programming.md#sync-and-async) for how callers choose between the two forms. + ### Docstrings We use the NumPy/SciPy docstring format. Ensure every public method has clear parameter descriptions and a "Notes" section with a sample JSON body where applicable. diff --git a/PYEGERIA_ISSUES.md b/PYEGERIA_ISSUES.md index a104ee25..7d765d1d 100644 --- a/PYEGERIA_ISSUES.md +++ b/PYEGERIA_ISSUES.md @@ -148,7 +148,7 @@ content was changed. The numbered section list above describes the # Open Issues -**At a glance** — 2 open pyegeria items, 0 awaiting re-test, 0 open Egeria Server issues (2026-10-30: ISSUE-146's `remove_note` re-test passed, ISSUE-79's folder survey completes, ISSUE-108 did not reproduce at 200 links; all three moved to the Appendix. 2026-10-29: ISSUE-159, 132 and 85 live-verified; 12 Egeria-side fixes re-confirmed or closed on earlier passes and moved to the Appendix). +**At a glance** — 3 open pyegeria items, 0 awaiting re-test, 0 open Egeria Server issues (2026-10-30: ISSUE-146's `remove_note` re-test passed, ISSUE-79's folder survey completes, ISSUE-108 did not reproduce at 200 links; all three moved to the Appendix. 2026-10-29: ISSUE-159, 132 and 85 live-verified; 12 Egeria-side fixes re-confirmed or closed on earlier passes and moved to the Appendix). **Egeria team note, 2026-10-18 (Mandy Chessell).** Saved verbatim at `~/.re-gate/EGERIA-TEAM-NOTE-2026-10-18.md`. Each entry below has a dated @@ -172,6 +172,7 @@ re-test candidates moved into *Awaiting re-test* below the open sections. create-from-template) and 7 (`viewElementGUID`) are still open. **Open pyegeria items** +- ISSUE-168: pyegeria can't run on Python 3.14: `nest_asyncio`, applied at import time, makes `asyncio.current_task()` return None - ISSUE-155: pyegeria gaps against Egeria `main` since 6.2 (omvs_audit + source diff, V6.2..05a5e982) - ISSUE-150: Dr.Egeria commands for an Analytic Function's Egeria declaration: a GovernanceActionType that Resource Explorer runs as an engine host, plus a synchronous path that bypasses Egeria @@ -192,6 +193,32 @@ into the entry now, so it isn't rediscovered from scratch later. --- +### ISSUE-168: pyegeria can't run on Python 3.14: `nest_asyncio`, applied at import time, makes `asyncio.current_task()` return None + +**Layer:** pyegeria · **Status:** fix drafted on branch `fix/issue-168-py314-sync-runner` (not merged) · **Found:** 2026-10-29, when the owner asked why pyegeria caps Python at `<3.14`. + +**What:** `pyproject.toml` caps `requires-python` at `<3.14` and CI tests only 3.12/3.13. The release workflow's comment blamed Textual (37 TUI tests failed with `assert task is not None` in `textual/rlock.py` when a 2026-08-19 release run picked up 3.14). Re-run 2026-10-29 on Python 3.14.5 with the cap lifted in a scratch worktree: **162 of 1661 micro-tests fail, all in the Textual apps (`tests/micro-tests/my_profile/`) and `test_my_egeria_serve.py`**; everything else passes. + +**Cause:** not Textual (8.2.8 supports 3.14). pyegeria calls `nest_asyncio.apply()` when `pyegeria/view/mermaid_utilities.py` is imported (also `pyegeria/core/mcp_server.py` and three `commands/` modules). With `nest_asyncio` 1.6.0 (no release since 2024), `asyncio.current_task()` returns None inside a task on 3.14 but not on 3.13: + +| | 3.13.2 | 3.14.5 | +|---|---|---| +| plain `asyncio.run`: `current_task()` set | yes | yes | +| after `nest_asyncio.apply()` | yes | **no** | + +Textual's `RLock` and aiohttp's timeout ("Timeout context manager should be used inside a task") both need it. `nest_asyncio` is there because every sync wrapper (1310 call sites in 41 files) did `asyncio.get_event_loop().run_until_complete(...)`, which fails inside a running loop (Jupyter, Textual) without it. On 3.14 `get_event_loop()` also no longer creates a loop. + +**Fix (drafted):** +- `pyegeria/core/async_runner.run_sync(coro)`: no running loop → this thread's persistent loop; a running loop → one shared background thread with its own persistent loop; called from inside that background loop → a one-off thread (no deadlock). +- All 1310 sync-wrapper call sites now call `run_sync(...)` (mechanical rewrite); both `make_request` sync paths too (their `run_coroutine_threadsafe(coro, ).result()` would deadlock without `nest_asyncio`). +- The per-thread httpx session now remembers its event loop and is replaced when the thread runs a different loop (sync calls, then `asyncio.run` of an async call); a session assigned via the setter is kept. +- `nest_asyncio` removed from pyegeria, `commands/`, `my_egeria`, and the dependency list; `requires-python` is `<3.15`; CI tests 3.12/3.13/3.14; releases stay on 3.13. +- Tests: `tests/micro-tests/test_async_runner.py` (8). Full micro-tests pass on 3.13 and 3.14 (1669, 0 failed). Live read-only smoke on both versions: plain script, sync calls inside a running loop followed by a direct `await`, sync after `asyncio.run`, three threads. + +**Not yet checked:** the Textual apps and the MCP server interactively, and a real Jupyter kernel. **Behaviour change for users:** notebooks that relied on pyegeria applying `nest_asyncio` to make their own `asyncio.run(...)` calls work inside Jupyter must now `await` instead (or apply `nest_asyncio` themselves, on 3.13 or older). + +--- + ### ISSUE-155: pyegeria gaps against Egeria `main` since 6.2 (omvs_audit + source diff, V6.2..05a5e982) **Status 2026-10-29:** items 1 (Governance Engine moves, #460), 5 (undo/restore) and 6 (usage-activity and popularity classifications) are done and released, and item 2 is fixed under ISSUE-154. Still open: item 4 (`typeName`, which only `OpenMetadataTemplateRequestBody` carries) and item 7 (`GetOptions.viewElementGUID`, low priority). diff --git a/commands/ops/table_integ_daemon_status.py b/commands/ops/table_integ_daemon_status.py index e8d5b17a..2ac4795a 100755 --- a/commands/ops/table_integ_daemon_status.py +++ b/commands/ops/table_integ_daemon_status.py @@ -12,7 +12,6 @@ import time from typing import Union -import nest_asyncio from rich import box from rich.table import Table from textual.widgets import DataTable @@ -122,7 +121,6 @@ def display_integration_daemon_status( """ s_client = EgeriaTech(view_server, view_url, user, user_pass) - nest_asyncio.apply() def generate_table() -> Table: """Make a new table.""" diff --git a/commands/tech/list_tech_templates.py b/commands/tech/list_tech_templates.py index 8ef5c1d4..456729f3 100644 --- a/commands/tech/list_tech_templates.py +++ b/commands/tech/list_tech_templates.py @@ -6,7 +6,6 @@ import time from typing import Union -import nest_asyncio from rich import box from rich.console import Console from rich.prompt import Prompt @@ -97,7 +96,6 @@ def display_templates_spec( data_table: bool = False, ) -> Table | DataTable: a_client = AutomatedCuration(server, url, username) - nest_asyncio.apply() token = a_client.create_egeria_bearer_token(username, password) tech_list = a_client.find_technology_types(search_string, page_size=0) diff --git a/commands/tech/spec_editor.py b/commands/tech/spec_editor.py index 0323db2d..dd9c83e6 100644 --- a/commands/tech/spec_editor.py +++ b/commands/tech/spec_editor.py @@ -371,10 +371,10 @@ def main(port: int, compact_dir: str | None) -> None: _state["compact_dir"] = Path(compact_dir).resolve() click.echo(f"Serving compact_commands from: {_state['compact_dir']}") click.echo(f"Open http://localhost:{port} in your browser") - # Some pyegeria imports apply nest_asyncio, which patches asyncio.run() with a - # signature that doesn't accept uvicorn.run()'s internal loop_factory kwarg. - # Building the Server ourselves and calling plain asyncio.run(server.serve()) - # avoids that incompatible call path. + # pyegeria imports used to apply nest_asyncio (removed in ISSUE-168), which + # patched asyncio.run() with a signature that doesn't accept uvicorn.run()'s + # internal loop_factory kwarg. Building the Server ourselves and calling plain + # asyncio.run(server.serve()) works either way. config = uvicorn.Config(app, host="127.0.0.1", port=port) server = uvicorn.Server(config) asyncio.run(server.serve()) diff --git a/commands/tech/table_tech_templates.py b/commands/tech/table_tech_templates.py index 04d1cdb0..916b517e 100644 --- a/commands/tech/table_tech_templates.py +++ b/commands/tech/table_tech_templates.py @@ -8,7 +8,6 @@ from datetime import datetime from typing import Union -import nest_asyncio from rich import box from rich.console import Console from rich.markdown import Markdown @@ -80,7 +79,6 @@ def display_templates_spec( placeholders: bool = False, ) -> Table | DataTable: a_client = AutomatedCuration(server, url, username) - nest_asyncio.apply() token = a_client.create_egeria_bearer_token(username, password) tech_list = a_client.find_technology_types(search_string, page_size=0) diff --git a/docs/developer_guide_pyegeria_textual.md b/docs/developer_guide_pyegeria_textual.md index d4009f4e..54bcf3c7 100644 --- a/docs/developer_guide_pyegeria_textual.md +++ b/docs/developer_guide_pyegeria_textual.md @@ -258,7 +258,9 @@ Every public method has two forms. `find_glossaries(...)` is synchronous and sim scripts. `_async_find_glossaries(...)` is the `async` implementation it wraps. Use the async form when you are already inside an event loop, as Textual apps and Dr. Egeria are, and want to `await` the call. The My Profile app does this when it loads the profile -(`await self.my_profile_inst._async_get_my_profile(...)`). +(`await self.my_profile_inst._async_get_my_profile(...)`). A sync call from a Textual handler +still works, but the screen stops responding until Egeria answers. See +[Sync and async](user_programming.md#sync-and-async) for more examples. ### Step 1: a first program diff --git a/docs/dr_egeria_manual.md b/docs/dr_egeria_manual.md index 13ef10b3..a52e3060 100644 --- a/docs/dr_egeria_manual.md +++ b/docs/dr_egeria_manual.md @@ -572,7 +572,7 @@ process_md_file( ) ``` -This is the simplest entry point. It creates the `EgeriaTech` client internally from the connection parameters you supply, then runs the async v2 engine synchronously via `asyncio.run()`. +This is the simplest entry point. It creates the `EgeriaTech` client internally from the connection parameters you supply, then runs the async v2 engine and waits for it to finish. It works in a script and in a Jupyter cell. **Example — validate a file (reading connection details from config):** @@ -701,7 +701,7 @@ await process_md_file_v2( ) ``` -> **Note**: Jupyter kernels run their own event loop, so `asyncio.run()` will raise a `RuntimeError` inside a notebook cell. Use `await` directly (as shown above) or install `nest_asyncio` and call `nest_asyncio.apply()` once at the top of your notebook if you need to keep `asyncio.run()` calls. +> **Note**: Jupyter kernels run their own event loop, so `asyncio.run()` raises a `RuntimeError` inside a notebook cell. Use `await` directly (as shown above), or call the sync `process_md_file(...)`, which works in a cell. Don't add `nest_asyncio` for this: it breaks asyncio on Python 3.14, and pyegeria no longer needs it. See [Sync and async](user_programming.md#sync-and-async) in the programming guide. --- diff --git a/docs/user_programming.md b/docs/user_programming.md index 386cf849..66567193 100644 --- a/docs/user_programming.md +++ b/docs/user_programming.md @@ -177,25 +177,112 @@ from pyegeria.omvs.glossary_manager import GlossaryManager glossary_client = GlossaryManager() ``` -### Async API +### Sync and async -Most methods have an underlying asynchronous implementation (prefixed with `_async_`). While the public API is generally synchronous for ease of use in scripts and notebooks, you can use the async versions if building an asynchronous application: +Every public method comes in two forms with the same arguments and the same result: + +- `client.find_glossaries("*")`: synchronous. It returns when the request is done. +- `await client._async_find_glossaries("*")`: a coroutine, for code that already runs on an event loop. + +The sync form works everywhere: in a script, in a Jupyter cell, inside a running event loop, and in worker threads. You don't need `nest_asyncio`. Releases up to 6.2.15 relied on it, and it breaks asyncio on Python 3.14. + +#### Which form to use + +| Where your code runs | Use | Why | +| :--- | :--- | :--- | +| A script, CLI command or scheduled job | sync | Simplest. pyegeria keeps one event loop and one connection pool per thread for you. | +| A Jupyter notebook | either | Sync calls work in a cell, and so does a top-level `await`. | +| An async application (FastAPI, Textual, aiohttp, an MCP server) | async | A sync call works there, but it blocks the application's event loop until Egeria answers. | +| Many independent requests | async with `asyncio.gather` | The requests run at the same time instead of one after another. | +| Worker threads (`ThreadPoolExecutor`) | sync | Each thread gets its own event loop and connections. | + +#### A script: use the sync form + +```python +from pyegeria import EgeriaTech + +client = EgeriaTech("qs-view-server", "https://localhost:9443", "erinoverview", "secret") +client.create_egeria_bearer_token() + +glossaries = client.find_glossaries("*", page_size=10) +print(glossaries if isinstance(glossaries, str) else len(glossaries)) +client.close_session() +``` + +#### A Jupyter notebook: either form + +Jupyter cells already run on an event loop. Both forms work in a cell, so pick whichever reads better: + +```python +client = EgeriaTech("qs-view-server", "https://localhost:9443", "erinoverview", "secret") +client.create_egeria_bearer_token() + +glossaries = client.find_glossaries("*") # sync works in a cell +collections = await client._async_find_collections("*") # so does a top-level await +``` + +Don't call `asyncio.run(...)` in a cell, because a loop is already running there; use `await` instead. If an older notebook calls `asyncio.get_event_loop().run_until_complete(client._async_x(...))`, replace it with the sync method `client.x(...)`. If it calls `nest_asyncio.apply()`, that still works on Python 3.13 or older, but remove it before you move the notebook to Python 3.14. + +#### An async application: await the `_async_` form + +In a coroutine, await the async form for the token, the calls and the close: ```python import asyncio from pyegeria import EgeriaTech async def main(): - client = EgeriaTech() - client.create_egeria_bearer_token() - - # Use the async variant - assets = await client._async_find_in_asset_domain("*") - print(assets) + client = EgeriaTech("qs-view-server", "https://localhost:9443", "erinoverview", "secret") + await client._async_create_egeria_bearer_token() + try: + glossaries = await client._async_find_glossaries("*", page_size=10) + ... + finally: + await client._async_close_session() asyncio.run(main()) ``` +A sync call inside a coroutine still works: pyegeria runs it on a background thread and waits. But while it waits, nothing else on your event loop runs. Against a local quickstart, one `find_glossaries` call made from a coroutine held up the loop for about 3 seconds. In a web server that means every other request waits too. In a Textual app the screen freezes. + +#### Many requests at once: `asyncio.gather` + +This is where the async form pays off even outside an async application. Independent requests overlap instead of queuing: + +```python +async def overview(client): + glossaries, collections, assets = await asyncio.gather( + client._async_find_glossaries("*", page_size=10), + client._async_find_collections("*", page_size=10), + client._async_find_in_asset_domain("Coco", page_size=10), + ) + return glossaries, collections, assets +``` + +Against a local quickstart, these three queries took about 4 seconds with `gather` and about 7.5 seconds one after another. Each client opens at most 10 connections per event loop, so with more than 10 requests in flight the extra ones wait for a free connection. + +#### Worker threads: use the sync form + +One client can be shared by several threads. Each thread gets its own event loop and connection pool: + +```python +from concurrent.futures import ThreadPoolExecutor + +with ThreadPoolExecutor(max_workers=4) as pool: + results = list(pool.map(lambda s: client.find_glossaries(s), ["Coco*", "Clinical*", "*"])) +``` + +#### What happens underneath + +Each sync method calls `pyegeria.core.async_runner.run_sync()` on its `_async_` method: + +- **No event loop running in the thread** (scripts, worker threads): the coroutine runs on that thread's own long-lived event loop. +- **An event loop is already running** (Jupyter, FastAPI, Textual): the coroutine runs on a shared background thread named `pyegeria-sync-runner`, and the calling thread waits for the result. + +The client's HTTP connection pool belongs to one thread and one event loop. If a thread switches loops, for example a sync call followed by `asyncio.run(...)` in the same script, the client opens a new pool for the new loop. Mixing the two forms in this way works, but keeping to one form per thread reuses connections best. + +When you are finished, close the client: `client.close_session()` in sync code, or `await client._async_close_session()` in a coroutine. + ### Long-Running Sessions Applications that keep a pyegeria client alive for extended periods — Jupyter notebooks, portal servers, scheduled jobs, or any process that runs longer than a few minutes — will encounter two challenges if left unaddressed: **idle-connection expiry** and **bearer-token expiry**. @@ -229,11 +316,9 @@ client2.set_bearer_token(my_token) # When my_token expires, call set_bearer_token() again with a fresh one ``` -#### Async applications — avoid `create_egeria_bearer_token()` inside coroutines - -The sync `create_egeria_bearer_token()` method calls `asyncio.get_event_loop().run_until_complete(...)` internally. Calling it from within a running async context (FastAPI route, async Jupyter cell, etc.) raises `RuntimeError: This event loop is already running`. +#### Async applications: create the token with the async form -Use the async variant instead: +In a coroutine (a FastAPI route, a Textual handler), use `await client._async_create_egeria_bearer_token()`. The sync `create_egeria_bearer_token()` also works there, but it blocks the event loop while it waits for Egeria (see [Sync and async](#sync-and-async)). ```python # In a FastAPI route or any async function: diff --git a/md_processing/dr_egeria.py b/md_processing/dr_egeria.py index 60b27731..fb9ff172 100644 --- a/md_processing/dr_egeria.py +++ b/md_processing/dr_egeria.py @@ -59,6 +59,7 @@ from pyegeria import settings, EgeriaTech, PyegeriaException, print_basic_exception, print_validation_error from pyegeria.core.config import settings, resolve_egeria_credentials +from pyegeria.core.async_runner import run_sync # Configure logging - module level default log_format = "{time} | {level} | {function} | {line} | {message} | {extra}" @@ -908,8 +909,8 @@ def process_md_file(input_file: str, output_folder: str, directive: str, server: set_usage_level(usage_level) client = EgeriaTech(server, url, user_id=userid) client.create_egeria_bearer_token(userid, user_pass) - asyncio.run(process_md_file_v2(input_file, output_folder, directive, client, parse_summary, attribute_logs, - usage_level, summary_only, debug=debug)) + run_sync(process_md_file_v2(input_file, output_folder, directive, client, parse_summary, attribute_logs, + usage_level, summary_only, debug=debug)) if __name__ == "__main__": import argparse diff --git a/my_egeria/my_egeria/utils/egeria_client.py b/my_egeria/my_egeria/utils/egeria_client.py index 6c974811..156dd759 100644 --- a/my_egeria/my_egeria/utils/egeria_client.py +++ b/my_egeria/my_egeria/utils/egeria_client.py @@ -8,7 +8,6 @@ """ -import asyncio import os import time from typing import Any, Callable, Optional, Tuple @@ -95,12 +94,6 @@ def __init__(self, config: Optional[EgeriaConfig] = None): _register_manager(self) def get_client(self) -> Any: - # Set a standard loop policy to avoid deadlocks with nest_asyncio + run_coroutine_threadsafe - try: - asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy()) - except Exception: - pass - # Import pyegeria lazily to avoid import-time config validation during test collection try: from pyegeria import EgeriaTech diff --git a/pyegeria/core/README.md b/pyegeria/core/README.md index bcc3c4a9..9fe57585 100644 --- a/pyegeria/core/README.md +++ b/pyegeria/core/README.md @@ -9,6 +9,7 @@ builds on, plus shared config/exception/validation infrastructure. | File | Role | |---|---| | `_base_platform_client.py` → `_base_server_client.py` → `_server_client.py` | Layered HTTP stack: platform-level connectivity → server-level auth/session → the shared request/validate/response helpers (`_async_make_request`, `_async_new_relationship_request`, `_async_delete_element_request`, etc.) every `pyegeria/omvs/*.py` client inherits from. | +| `async_runner.py` | `run_sync(coro)` — what every sync wrapper calls. Runs the coroutine on a per-thread persistent loop, or on a background thread when a loop is already running (Jupyter, Textual, async apps), so no `nest_asyncio` is needed (ISSUE-168). | | `config.py` | Pydantic-settings config; precedence = explicit args > OS env > `.env` > `config.json` > defaults. | | `_exceptions.py` | The `PyegeriaException` hierarchy — see `pyegeria/README.md`'s "Exceptions in pyegeria" section for the full class list and usage. | | `_validators.py` | Shared request-body/parameter validation helpers. | diff --git a/pyegeria/core/_base_platform_client.py b/pyegeria/core/_base_platform_client.py index f4872df3..cb859f17 100644 --- a/pyegeria/core/_base_platform_client.py +++ b/pyegeria/core/_base_platform_client.py @@ -35,6 +35,7 @@ validate_user_id, _validate_url_path_safe, ) +from pyegeria.core.async_runner import run_sync # Elements classified as Promise (not yet delivered) or Memento (logically # deleted) are only returned to requests with forLineage=true. Inside a @@ -214,8 +215,20 @@ def __init__( @property def session(self) -> AsyncClient: - """Get the httpx session for the current thread.""" - if not hasattr(self._thread_local, "session"): + """Get the httpx session for the current thread and event loop. + + An httpx AsyncClient's connection pool belongs to the event loop that first used it, so a + thread that switches loops (a sync call, then asyncio.run of an async one) gets a new + session rather than reusing one bound to another loop (ISSUE-168). + """ + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = None + stale = (getattr(self._thread_local, "session_loop", None) is not loop + and not getattr(self._thread_local, "session_pinned", False)) + if not hasattr(self._thread_local, "session") or stale: + self._thread_local.session_loop = loop self._thread_local.session = AsyncClient( verify=enable_ssl_check, timeout=httpx.Timeout(timeout=float(self.timeout), connect=10.0), @@ -229,7 +242,9 @@ def session(self) -> AsyncClient: @session.setter def session(self, value: AsyncClient): - """Allow setting the session for the current thread.""" + """Allow setting the session for the current thread. A session set this way is kept even if + the thread later runs another event loop; the caller owns it.""" + self._thread_local.session_pinned = True self._thread_local.session = value async def _async_check_connection(self) -> str: @@ -267,16 +282,14 @@ def check_connection(self) -> str: PyegeriaConnectionException If the connection to the platform fails. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_check_connection()) + response = run_sync(self._async_check_connection()) return response def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): - loop = asyncio.get_event_loop() - loop.run_until_complete(self.session.aclose()) + run_sync(self.session.aclose()) if exc_type is not None: self.exc_type = exc_type self.exc_val = exc_val @@ -294,8 +307,7 @@ async def _async_close_session(self) -> None: def close_session(self) -> None: """Close the session""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_close_session()) + run_sync(self._async_close_session()) return async def _async_create_egeria_bearer_token( @@ -382,8 +394,7 @@ def create_egeria_bearer_token( A bearer token from another source can be set with the set_bearer_token() method. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_egeria_bearer_token(user_id, password) ) return response @@ -441,8 +452,7 @@ def refresh_egeria_bearer_token(self) -> str: PyegeriaNotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - token = loop.run_until_complete(self._async_refresh_egeria_bearer_token()) + token = run_sync(self._async_refresh_egeria_bearer_token()) return token def set_bearer_token(self, token: str) -> None: @@ -498,8 +508,7 @@ def get_platform_origin(self) -> str: str The platform origin string if reachable, otherwise an empty string. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self.async_get_platform_origin()) + response = run_sync(self.async_get_platform_origin()) return response # @logger.catch @@ -542,17 +551,8 @@ def make_request( """ if timeout is None: timeout = self.timeout - try: - loop = asyncio.get_running_loop() - if loop.is_running(): - coro = self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout) - return asyncio.run_coroutine_threadsafe(coro, loop).result() - else: - return loop.run_until_complete( - self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout)) - except RuntimeError: - # No running loop exists; run the coroutine - return asyncio.run(self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout)) + return run_sync( + self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout)) async def _async_make_request( diff --git a/pyegeria/core/_base_server_client.py b/pyegeria/core/_base_server_client.py index 597d8980..d07a35e5 100644 --- a/pyegeria/core/_base_server_client.py +++ b/pyegeria/core/_base_server_client.py @@ -33,6 +33,7 @@ validate_user_id, _validate_url_path_safe, ) +from pyegeria.core.async_runner import run_sync ... @@ -159,8 +160,20 @@ def __init__( @property def session(self) -> AsyncClient: - """Get the httpx session for the current thread.""" - if not hasattr(self._thread_local, "session"): + """Get the httpx session for the current thread and event loop. + + An httpx AsyncClient's connection pool belongs to the event loop that first used it, so a + thread that switches loops (a sync call, then asyncio.run of an async one) gets a new + session rather than reusing one bound to another loop (ISSUE-168). + """ + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = None + stale = (getattr(self._thread_local, "session_loop", None) is not loop + and not getattr(self._thread_local, "session_pinned", False)) + if not hasattr(self._thread_local, "session") or stale: + self._thread_local.session_loop = loop self._thread_local.session = AsyncClient( verify=enable_ssl_check, timeout=httpx.Timeout(timeout=float(self.timeout), connect=10.0), @@ -169,7 +182,9 @@ def session(self) -> AsyncClient: @session.setter def session(self, value: AsyncClient): - """Allow setting the session for the current thread.""" + """Allow setting the session for the current thread. A session set this way is kept even if + the thread later runs another event loop; the caller owns it.""" + self._thread_local.session_pinned = True self._thread_local.session = value async def _async_check_connection(self) -> str: @@ -207,15 +222,14 @@ def check_connection(self) -> str: PyegeriaConnectionException If the connection to the platform fails. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_check_connection()) + response = run_sync(self._async_check_connection()) return response def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): - self.session.aclose() + run_sync(self.session.aclose()) if exc_type is not None: self.exc_type = exc_type self.exc_val = exc_val @@ -233,8 +247,7 @@ async def _async_close_session(self) -> None: def close_session(self) -> None: """Close the session""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_close_session()) + run_sync(self._async_close_session()) return async def _async_create_egeria_bearer_token( @@ -320,8 +333,7 @@ def create_egeria_bearer_token( A bearer token from another source can be set with the set_bearer_token() method. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_egeria_bearer_token(user_id, password, new_password) ) return response @@ -379,8 +391,7 @@ def refresh_egeria_bearer_token(self) -> str: PyegeriaNotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - token = loop.run_until_complete(self._async_refresh_egeria_bearer_token()) + token = run_sync(self._async_refresh_egeria_bearer_token()) return token def set_bearer_token(self, token: str, source: str="Egeria") -> None: @@ -452,8 +463,7 @@ def get_platform_origin(self) -> str: str The platform origin string if reachable, otherwise an empty string. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self.async_get_platform_origin()) + response = run_sync(self.async_get_platform_origin()) return response def make_request( @@ -495,17 +505,8 @@ def make_request( """ if timeout is None: timeout = self.timeout - try: - loop = asyncio.get_running_loop() - if loop.is_running(): - coro = self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout) - return asyncio.run_coroutine_threadsafe(coro, loop).result() - else: - return loop.run_until_complete( - self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout)) - except RuntimeError: - # No running loop exists; run the coroutine - return asyncio.run(self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout)) + return run_sync( + self._async_make_request(request_type, endpoint, payload, is_json, params, timeout=timeout)) async def _async_make_request( diff --git a/pyegeria/core/_server_client.py b/pyegeria/core/_server_client.py index 875835a5..f137c10a 100644 --- a/pyegeria/core/_server_client.py +++ b/pyegeria/core/_server_client.py @@ -86,6 +86,7 @@ ActivityStatusRequestBody, ActionRequestBody ) +from pyegeria.core.async_runner import run_sync __all__ = [ # Models @@ -348,8 +349,7 @@ def __get_guid__( Egeria resource name convention. The organization_name falls back to self.organization_name if not supplied. Sync version. """ - loop = asyncio.get_event_loop() - result = loop.run_until_complete( + result = run_sync( self.__async_get_guid__( guid, display_name, property_name, qualified_name, tech_type, organization_name ) @@ -396,8 +396,7 @@ def get_valid_metadata_values( """ Synchronous version of _async_get_valid_metadata_values. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_valid_metadata_values(property_name, type_name) ) @@ -563,8 +562,7 @@ def get_relationships_with_property_value( The requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_relationships_with_property_value( relationship_type, property_value, @@ -728,8 +726,7 @@ def get_elements_by_property_value( PyegeriaException. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_by_property_value(property_value, property_names, metadata_element_type, effective_time, for_lineage, for_duplicate_processing, start_from, page_size, output_format, report_spec, timeout, **kwargs) @@ -802,8 +799,7 @@ def get_guid_for_name( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_guid_for_name(name, property_name, type_name) ) return response @@ -871,8 +867,7 @@ def _get_element_by_guid_(self, element_guid: str) -> dict | str: PyegeriaUnauthorizedException the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - result = loop.run_until_complete( + result = run_sync( self._async_get_element_by_guid_( element_guid ) @@ -999,8 +994,7 @@ def get_connector_guid(self, connector_name: str) -> str: str: The guid of the connector. """ - loop = asyncio.get_event_loop() - result = loop.run_until_complete( + result = run_sync( self._async_get_connector_guid( connector_name ) @@ -1104,8 +1098,7 @@ def add_archive_file( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_archive_file( archive_file, server_guid, display_name, qualified_name, timeout, organization_name ) @@ -1207,8 +1200,7 @@ def add_comment_to_element( PyEgeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_comment_to_element(element_guid, comment, comment_type, body) ) return response @@ -1324,8 +1316,7 @@ def update_comment( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_comment(comment_guid, comment, comment_type, body, merge_update) ) @@ -1386,8 +1377,7 @@ def setup_accepted_answer( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_setup_accepted_answer(question_comment_guid, answer_comment_guid) ) @@ -1444,8 +1434,7 @@ def setup_clear_answer( PyEgeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_accepted_answer(question_comment_guid, answer_comment_guid) ) @@ -1514,8 +1503,7 @@ def remove_comment_from_element( ------ PyEgeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_comment_from_element(comment_guid, body, cascade_delete=cascade_delete) ) @@ -1586,8 +1574,7 @@ def get_comment_by_guid( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_comment_by_guid(guid, graph_query_depth, output_format, report_spec, body, **kwargs) ) return response @@ -1672,8 +1659,7 @@ def get_attached_comments( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_attached_comments(element_guid, metadata_element_type_name, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -1850,8 +1836,7 @@ def find_comments( """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_find_comments(search_string, classification_names, metadata_element_subtypes, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -2174,8 +2159,7 @@ def create_note_log( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_note_log(element_guid, display_name, description, body) ) return response @@ -2310,8 +2294,7 @@ def update_note_log( description (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_update_note_log(note_log_guid, display_name, description, body, merge_update) ) return response @@ -2376,8 +2359,7 @@ def remove_note_log( ------ PyEgeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_note_log(note_log_guid, body, cascade_delete) ) @@ -2571,8 +2553,7 @@ def find_note_logs( """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_find_note_logs(search_string, classification_names, metadata_element_subtypes, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -2660,8 +2641,7 @@ def get_note_logs_by_name( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_note_logs_by_name(name, metadata_element_type_name, metadata_element_subtypes, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) @@ -2735,8 +2715,7 @@ def get_note_log_by_guid( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_note_log_by_guid(guid, graph_query_depth, output_format, report_spec, body, **kwargs) ) return response @@ -2821,8 +2800,7 @@ def get_attached_note_logs( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_attached_note_logs(element_guid, metadata_element_type_name, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -3007,8 +2985,7 @@ def create_note( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_note(note_log_guid, display_name, description, associated_element, body) ) return response @@ -3190,8 +3167,7 @@ def add_journal_entry(self, note_log_qn: Optional[str] = None, element_qn: Optio } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_journal_entry(note_log_qn, element_qn, note_log_display_name, journal_entry_display_name, note_entry, body) ) return response @@ -3345,8 +3321,7 @@ def update_note( merge_update (): """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_note(note_guid, display_name, description, body, merge_update) ) @@ -3415,8 +3390,7 @@ def remove_note( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_note( note_guid, body @@ -3619,8 +3593,7 @@ def find_notes( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_notes(search_string=search_string, body=body, starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case, start_from=start_from, page_size=page_size, output_format=output_format, @@ -3704,8 +3677,7 @@ def get_note_by_guid( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_note_by_guid(guid, metadata_element_type_name, graph_query_depth, output_format, report_spec, body, **kwargs) ) return response @@ -3797,8 +3769,7 @@ def get_notes_for_note_log( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_notes_for_note_log(note_log_guid, metadata_element_type_name, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -3890,8 +3861,7 @@ def create_informal_tag( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_informal_tag(display_name, description, qualified_name, body) ) return response @@ -3968,8 +3938,7 @@ def update_tag_description( Args: body (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_update_tag_description(tag_guid, description) ) return response @@ -4031,8 +4000,7 @@ def delete_tag( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_delete_tag(tag_guid) ) @@ -4143,8 +4111,7 @@ def get_tag_by_guid( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_tag_by_guid(guid, graph_query_depth, output_format, report_spec, body, **kwargs) ) return response @@ -4236,8 +4203,7 @@ def get_tags_by_name( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_tags_by_name(name, metadata_element_type_name, metadata_element_subtypes, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) @@ -4400,8 +4366,7 @@ def find_tags( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_tags(search_string, body, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, **kwargs) ) @@ -4521,8 +4486,7 @@ def find_my_tags( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_my_tags( search_string, body, @@ -4605,8 +4569,7 @@ def add_tag_to_element( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_tag_to_element( element_guid, tag_guid, @@ -4692,8 +4655,7 @@ def get_elements_by_tag( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_by_tag(tag_guid, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -4780,8 +4742,7 @@ def get_attached_tags( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_attached_tags(element_guid, metadata_element_type_name, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -4860,8 +4821,7 @@ def remove_tag_from_element( PyegeriaUnauthorizedException the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_remove_tag_from_element( element_guid, tag_guid, @@ -4990,8 +4950,7 @@ def add_like_to_element( } } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_like_to_element(element_guid, emoji, body) ) return response @@ -5085,8 +5044,7 @@ def get_attached_likes( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_attached_likes(element_guid, metadata_element_type_name, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -5156,8 +5114,7 @@ def remove_like_from_element( PyegeriaUnauthorizedException The requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_remove_like_from_element(element_guid, body) ) return response @@ -5261,8 +5218,7 @@ def add_rating_to_element( } } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_rating_to_element(element_guid, is_public, body) ) return response @@ -5356,8 +5312,7 @@ def get_attached_ratings( ------ PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_attached_ratings(element_guid, metadata_element_type_name, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -5427,8 +5382,7 @@ def remove_rating_from_element( PyegeriaUnauthorizedException The requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_remove_rating_from_element(element_guid, body) ) return response @@ -5536,8 +5490,7 @@ def add_search_keyword_to_element( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_search_keyword_to_element(element_guid, keyword, body) ) return response @@ -5624,8 +5577,7 @@ def update_search_keyword( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_search_keyword(keyword_guid, body) ) @@ -5678,8 +5630,7 @@ def remove_search_keyword( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_search_keyword(keyword_guid ) ) @@ -5753,8 +5704,7 @@ def get_search_keyword_by_guid( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_search_keyword_by_guid(guid, graph_query_depth, output_format, report_spec, body, **kwargs) ) return response @@ -5852,8 +5802,7 @@ def get_search_keyword_by_keyword( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_search_keyword_by_keyword(name, metadata_element_type_name, metadata_element_subtypes, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs) @@ -6014,8 +5963,7 @@ def find_search_keywords( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_search_keywords(search_string, body, start_from=start_from, page_size=page_size, output_format=output_format, report_spec=report_spec, **kwargs) ) @@ -7613,8 +7561,7 @@ def update_element_effectivity(self, guid: str, status: Optional[str] = None, "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_element_status(guid, status, body)) + run_sync(self._async_update_element_status(guid, status, body)) @dynamic_catch @@ -7676,8 +7623,7 @@ def create_asset(self, asset_type: Optional[list[str]] = None, body: dict | NewE ----- See: https://egeria-project.org/concepts/asset """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_asset(asset_type, body)) + return run_sync(self._async_create_asset(asset_type, body)) @dynamic_catch async def _async_create_asset_from_template( @@ -7729,8 +7675,7 @@ def create_asset_from_template(self, body: dict | TemplateRequestBody | None = N ValidationError Pydantic validation errors are raised if the body does not conform to the TemplateRequestBody. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_asset_from_template(body)) + return run_sync(self._async_create_asset_from_template(body)) @dynamic_catch async def _async_update_asset( @@ -7785,8 +7730,7 @@ def update_asset( ValidationError Pydantic validation errors are raised if the body does not conform to the UpdateElementRequestBody. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_asset(asset_guid, body)) + run_sync(self._async_update_asset(asset_guid, body)) @dynamic_catch async def _async_delete_asset( @@ -7837,8 +7781,7 @@ def delete_asset( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_asset(asset_guid, body)) + run_sync(self._async_delete_asset(asset_guid, body)) @dynamic_catch async def _async_find_assets( @@ -8009,8 +7952,7 @@ def find_assets(self, search_string: str = "*", starts_with: bool = True, ends_w Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_assets(search_string=search_string, starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case, anchor_domain=anchor_domain, metadata_element_type=metadata_element_type, diff --git a/pyegeria/core/async_runner.py b/pyegeria/core/async_runner.py new file mode 100644 index 00000000..11015e7a --- /dev/null +++ b/pyegeria/core/async_runner.py @@ -0,0 +1,79 @@ +""" +PDX-License-Identifier: Apache-2.0 +Copyright Contributors to the ODPi Egeria project. + +Run a coroutine to completion from synchronous code (ISSUE-168). + +Every sync wrapper in the SDK calls `run_sync(self._async_x(...))`. This replaces the old +`asyncio.get_event_loop().run_until_complete(...)` pattern, which needed `nest_asyncio` to work +inside an already-running loop (Jupyter, Textual apps, async callers). `nest_asyncio` breaks +`asyncio.current_task()` on Python 3.14, and `get_event_loop()` no longer creates a loop there. + +Each thread's `httpx.AsyncClient` (the client's per-thread `session`) is tied to the loop that first +used it, so every thread gets one persistent loop instead of a fresh loop per call: + +- no loop running in this thread: run on this thread's own persistent loop; +- a loop is running: run on a shared background thread with its own persistent loop, and block + until it finishes; +- already on that background loop (a sync call made from inside a coroutine it is running): run + on a one-off thread, so the background loop never waits on itself. +""" + +import asyncio +import contextvars +import threading +from typing import Any, Coroutine, TypeVar + +T = TypeVar("T") + +_thread_state = threading.local() +_background_loop: asyncio.AbstractEventLoop | None = None +_background_lock = threading.Lock() + + +def _loop_for_this_thread() -> asyncio.AbstractEventLoop: + loop = getattr(_thread_state, "loop", None) + if loop is None or loop.is_closed(): + loop = asyncio.new_event_loop() + _thread_state.loop = loop + return loop + + +def _get_background_loop() -> asyncio.AbstractEventLoop: + global _background_loop + with _background_lock: + if _background_loop is None or _background_loop.is_closed(): + loop = asyncio.new_event_loop() + threading.Thread(target=loop.run_forever, name="pyegeria-sync-runner", daemon=True).start() + _background_loop = loop + return _background_loop + + +def _run_on_new_thread(coro: Coroutine[Any, Any, T]) -> T: + outcome: dict[str, Any] = {} + + def target() -> None: + try: + outcome["value"] = _loop_for_this_thread().run_until_complete(coro) + except BaseException as exc: # re-raised in the calling thread + outcome["error"] = exc + + # A new thread starts with an empty context; carry the caller's (e.g. lineage_visible()). + worker = threading.Thread(target=contextvars.copy_context().run, args=(target,), + name="pyegeria-sync-runner-nested") + worker.start() + worker.join() + if "error" in outcome: + raise outcome["error"] + return outcome["value"] + + +def run_sync(coro: Coroutine[Any, Any, T]) -> T: + """Run `coro` to completion and return its result, whether or not a loop is already running.""" + try: + running = asyncio.get_running_loop() + except RuntimeError: + return _loop_for_this_thread().run_until_complete(coro) + if running is _background_loop: + return _run_on_new_thread(coro) + return asyncio.run_coroutine_threadsafe(coro, _get_background_loop()).result() diff --git a/pyegeria/core/mcp_server.py b/pyegeria/core/mcp_server.py index efb7e3dc..10de12d5 100644 --- a/pyegeria/core/mcp_server.py +++ b/pyegeria/core/mcp_server.py @@ -5,7 +5,6 @@ """ import re import sys -import nest_asyncio from loguru import logger from typing import Any, Dict, Optional, Literal @@ -17,7 +16,6 @@ from pyegeria.view.base_report_formats import load_egeria_report_specs GLOBAL_EGERIA_CLIENT: Optional[EgeriaTech] = None -nest_asyncio.apply() try: # We use Optional[] and List[] types, so we import them. @@ -134,8 +132,6 @@ async def run_report_tool( ] = "DICT" ) -> Dict[str, Any]: import asyncio - import nest_asyncio - nest_asyncio.apply() """Run a report with the specified parameters.""" print("DEBUG: Running report...", file=sys.stderr) diff --git a/pyegeria/egeria_tech_client.py b/pyegeria/egeria_tech_client.py index da6bce06..b9b3ee4c 100644 --- a/pyegeria/egeria_tech_client.py +++ b/pyegeria/egeria_tech_client.py @@ -231,6 +231,16 @@ def get_token(self) -> str: return sub.get_token() return self.token + async def _async_close_session(self) -> None: + """Close sessions for all sub-clients that were instantiated (Async). Use from a running loop.""" + for sub in self._instantiated_clients.values(): + if hasattr(sub, "_async_close_session"): + try: + await sub._async_close_session() + except Exception: + pass + self._instantiated_clients.clear() + def close_session(self) -> None: """Close sessions for all sub-clients that were instantiated.""" for sub in self._instantiated_clients.values(): diff --git a/pyegeria/omvs/README.md b/pyegeria/omvs/README.md index dca555cf..bfd67a30 100644 --- a/pyegeria/omvs/README.md +++ b/pyegeria/omvs/README.md @@ -12,7 +12,8 @@ module-to-class mapping (`ActionAuthor`, `ActorManager`, `AssetCatalog`, Conventions every client follows: - Every public method has an `_async_*` implementation plus a sync wrapper - calling `asyncio.get_event_loop().run_until_complete(...)`. + calling `run_sync(self._async_*(...))` from `pyegeria/core/async_runner.py` + (never `asyncio.run` or `get_event_loop().run_until_complete`). - All public methods are decorated with `@dynamic_catch`. - **Ground truth for API URLs and request bodies is `pyegeria/http clients/Egeria-api-*.http`** — check these files before constructing a diff --git a/pyegeria/omvs/action_author.py b/pyegeria/omvs/action_author.py index dd5af3c8..f89b597d 100644 --- a/pyegeria/omvs/action_author.py +++ b/pyegeria/omvs/action_author.py @@ -20,6 +20,7 @@ GetRequestBody, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class GovernanceActionExecutorProperties(RelationshipBeanProperties): @@ -176,8 +177,7 @@ def link_governance_action_executor( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_governance_action_executor( governance_action_type_guid, governance_engine_guid, body ) @@ -199,8 +199,7 @@ def detach_governance_action_executor( governance_engine_guid: str, body: dict | DeleteRelationshipRequestBody, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_governance_action_executor( governance_action_type_guid, governance_engine_guid, body ) @@ -222,8 +221,7 @@ def link_target_for_governance_action( element_guid: str, body: dict | NewRelationshipRequestBody, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_target_for_governance_action(governance_action_guid, element_guid, body) ) @@ -243,8 +241,7 @@ def detach_target_for_governance_action( element_guid: str, body: dict | DeleteRelationshipRequestBody, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_target_for_governance_action( governance_action_guid, element_guid, body ) @@ -266,8 +263,7 @@ def setup_first_action_process_step( process_step_guid: str, body: dict | NewRelationshipRequestBody, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_setup_first_action_process_step(process_guid, process_step_guid, body) ) @@ -285,8 +281,7 @@ def remove_first_action_process_step( process_guid: str, first_process_step_guid: str, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_first_action_process_step(process_guid, first_process_step_guid) ) @@ -311,8 +306,7 @@ def setup_next_action_process_step( next_process_step_guid: str, body: dict | NewRelationshipRequestBody, ) -> Optional[str]: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_setup_next_action_process_step( process_step_guid, next_process_step_guid, body ) @@ -332,8 +326,7 @@ def update_next_action_process_step( relationship_guid: str, body: dict | UpdateRelationshipRequestBody, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_next_action_process_step(relationship_guid, body) ) @@ -349,8 +342,7 @@ def remove_next_action_process_step( self, relationship_guid: str, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_next_action_process_step(relationship_guid)) + run_sync(self._async_remove_next_action_process_step(relationship_guid)) @dynamic_catch async def _async_get_governance_action_process( @@ -416,8 +408,7 @@ def get_governance_action_process( dict | list | str The governance action process. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_governance_action_process( process_guid, output_format, report_spec, body, **kwargs ) @@ -489,8 +480,7 @@ def get_governance_action_process_graph( dict | list | str The governance action process graph. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_governance_action_process_graph( process_guid, output_format, report_spec, body, **kwargs ) diff --git a/pyegeria/omvs/actor_manager.py b/pyegeria/omvs/actor_manager.py index 7b560ef5..064a50d6 100644 --- a/pyegeria/omvs/actor_manager.py +++ b/pyegeria/omvs/actor_manager.py @@ -35,6 +35,7 @@ "ITProfileRoleProperties", "GovernanceRoleProperties","SolutionActorRoleProperties"] from pyegeria.core._server_client import ServerClient +from pyegeria.core.async_runner import run_sync class ActorManager(ServerClient): @@ -189,7 +190,7 @@ def create_actor_profile(self, body: Optional[dict | NewElementRequestBody] = No """ - return asyncio.get_event_loop().run_until_complete(self._async_create_actor_profile(body)) + return run_sync(self._async_create_actor_profile(body)) ####### @@ -306,8 +307,7 @@ def create_actor_profile_from_template(self, body: Optional[dict | TemplateReque } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_actor_profile_from_template(body)) + resp = run_sync(self._async_create_actor_profile_from_template(body)) return resp @dynamic_catch @@ -428,7 +428,7 @@ def update_actor_profile(self, actor_profile_guid: str, body: dict | UpdateEleme } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_actor_profile(actor_profile_guid, body)) @dynamic_catch @@ -534,8 +534,7 @@ def link_asset_to_profile(self, asset_guid: str, it_profile_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_asset_to_profile(asset_guid, it_profile_guid, body)) + run_sync(self._async_link_asset_to_profile(asset_guid, it_profile_guid, body)) @dynamic_catch async def _async_detach_asset_from_profile(self, asset_guid: str, it_profile_guid: str, @@ -623,8 +622,7 @@ def detach_asset_from_profile(self, asset_guid: str, it_profile_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_asset_from_profile(asset_guid, it_profile_guid, body)) + run_sync(self._async_detach_asset_from_profile(asset_guid, it_profile_guid, body)) @dynamic_catch async def _async_delete_actor_profile(self, actor_profile_guid: str, @@ -715,8 +713,7 @@ def delete_actor_profile(self, actor_profile_guid: str, body: Optional[dict | De "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_actor_profile(actor_profile_guid, body, cascade)) + run_sync(self._async_delete_actor_profile(actor_profile_guid, body, cascade)) @dynamic_catch async def _async_find_actor_profiles( @@ -879,8 +876,7 @@ def find_actor_profiles( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_actor_profiles( search_string=search_string, starts_with=starts_with, @@ -1020,8 +1016,7 @@ def get_actor_profiles_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actor_profiles_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -1126,8 +1121,7 @@ def get_actor_profile_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actor_profile_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -1370,7 +1364,7 @@ def create_actor_role(self, body: Optional[dict | NewElementRequestBody] = None) """ - return asyncio.get_event_loop().run_until_complete(self._async_create_actor_role(body)) + return run_sync(self._async_create_actor_role(body)) @dynamic_catch async def _async_create_actor_role_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str: @@ -1485,8 +1479,7 @@ def create_actor_role_from_template(self, body: Optional[dict | TemplateRequestB } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_actor_role_from_template(body)) + resp = run_sync(self._async_create_actor_role_from_template(body)) return resp @dynamic_catch @@ -1607,7 +1600,7 @@ def update_actor_role(self, actor_role_guid: str, body: dict | UpdateElementRequ } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_actor_role(actor_role_guid, body)) @dynamic_catch @@ -1707,8 +1700,7 @@ def link_person_role_to_profile(self, person_role_guid: str, person_profile_guid } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_person_role_to_profile(person_role_guid, person_profile_guid, body)) + run_sync(self._async_link_person_role_to_profile(person_role_guid, person_profile_guid, body)) @dynamic_catch async def _async_detach_person_role_from_profile(self, person_role_guid: str, person_profile_guid: str, @@ -1797,8 +1789,7 @@ def detach_person_role_from_profile(self, person_role_guid: str, person_profile_ "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_person_role_from_profile(person_role_guid, person_profile_guid, body)) # @@ -1899,8 +1890,7 @@ def link_team_role_to_profile(self, team_role_guid: str, team_profile_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_team_role_to_profile(team_role_guid, team_profile_guid, body)) + run_sync(self._async_link_team_role_to_profile(team_role_guid, team_profile_guid, body)) @dynamic_catch async def _async_detach_team_role_from_profile(self, team_role_guid: str, team_profile_guid: str, @@ -1988,8 +1978,7 @@ def detach_team_role_from_profile(self, team_role_guid: str, team_profile_guid: "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_team_role_from_profile(team_role_guid, team_profile_guid, body)) + run_sync(self._async_detach_team_role_from_profile(team_role_guid, team_profile_guid, body)) # @dynamic_catch @@ -2089,8 +2078,7 @@ def link_it_profile_role_to_it_profile(self, it_profile_role_guid: str, it_profi } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_it_profile_role_to_it_profile(it_profile_role_guid, it_profile_guid, body)) @dynamic_catch @@ -2180,8 +2168,7 @@ def detach_it_profile_role_from_it_profile(self, it_profile_role_guid: str, it_p "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_it_profile_role_from_it_profile(it_profile_role_guid, it_profile_guid, body)) # @@ -2276,8 +2263,7 @@ def delete_actor_role(self, actor_role_guid: str, body: Optional[dict | DeleteEl "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_actor_role(actor_role_guid, body, cascade)) + run_sync(self._async_delete_actor_role(actor_role_guid, body, cascade)) @dynamic_catch async def _async_find_actor_roles( @@ -2440,8 +2426,7 @@ def find_actor_roles( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_actor_roles( search_string=search_string, starts_with=starts_with, @@ -2581,8 +2566,7 @@ def get_actor_roles_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actor_roles_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -2687,8 +2671,7 @@ def get_actor_role_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actor_role_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -2944,7 +2927,7 @@ def create_user_identity(self, body: Optional[dict | NewElementRequestBody] = No """ - return asyncio.get_event_loop().run_until_complete(self._async_create_user_identity(body)) + return run_sync(self._async_create_user_identity(body)) @dynamic_catch async def _async_create_user_identity_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str: @@ -3057,8 +3040,7 @@ def create_user_identity_from_template(self, body: Optional[dict | TemplateReque } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_user_identity_from_template(body)) + resp = run_sync(self._async_create_user_identity_from_template(body)) return resp @dynamic_catch @@ -3181,7 +3163,7 @@ def update_user_identity(self, user_identity_guid: str, body: dict | UpdateEleme } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_user_identity(user_identity_guid, body)) @dynamic_catch @@ -3282,8 +3264,7 @@ def link_identity_to_profile(self, user_identity_guid: str, actor_profile_guid: } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_identity_to_profile(user_identity_guid, actor_profile_guid, body)) + run_sync(self._async_link_identity_to_profile(user_identity_guid, actor_profile_guid, body)) @dynamic_catch async def _async_detach_identity_from_profile(self, user_identity_guid: str, actor_profile_guid: str, @@ -3372,8 +3353,7 @@ def detach_identity_from_profile(self, user_identity_guid: str, actor_profile_gu "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_identity_from_profile(user_identity_guid, actor_profile_guid, body)) + run_sync(self._async_detach_identity_from_profile(user_identity_guid, actor_profile_guid, body)) @dynamic_catch async def _async_link_assignment_scope(self, scope_element_guid: str, actor_guid: str, @@ -3474,8 +3454,7 @@ def link_assignment_scope(self, scope_element_guid: str, actor_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_assignment_scope(scope_element_guid, actor_guid, body)) + run_sync(self._async_link_assignment_scope(scope_element_guid, actor_guid, body)) @dynamic_catch async def _async_detach_assignment_scope(self, scope_element_guid: str, actor_guid: str, @@ -3562,8 +3541,7 @@ def detach_assignment_scope(self, scope_element_guid: str, actor_guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_assignment_scope(scope_element_guid, actor_guid, body)) + run_sync(self._async_detach_assignment_scope(scope_element_guid, actor_guid, body)) @dynamic_catch async def _async_add_security_group_membership(self, user_identity_guid: str, security_groups: list[str] = [""], @@ -3667,8 +3645,7 @@ def add_security_group_membership(self, user_identity_guid: str, security_groups } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_security_group_membership(user_identity_guid, security_groups, body)) + run_sync(self._async_add_security_group_membership(user_identity_guid, security_groups, body)) @dynamic_catch async def _async_update_security_group_membership(self, user_identity_guid: str, @@ -3765,8 +3742,7 @@ def update_security_group_membership(self, user_identity_guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_security_group_membership(user_identity_guid, body)) + run_sync(self._async_update_security_group_membership(user_identity_guid, body)) @dynamic_catch async def _async_remove_all_security_group_memberships(self, user_identity_guid: str, @@ -3851,8 +3827,7 @@ def remove_all_security_group_memberships(self, user_identity_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_identity_from_profile(user_identity_guid, body)) + run_sync(self._async_detach_identity_from_profile(user_identity_guid, body)) # # do deletes etc @@ -3947,8 +3922,7 @@ def delete_user_identity(self, user_identity_guid: str, body: Optional[dict | De "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_user_identity(user_identity_guid, body, cascade)) + run_sync(self._async_delete_user_identity(user_identity_guid, body, cascade)) @dynamic_catch async def _async_find_user_identities( @@ -4111,8 +4085,7 @@ def find_user_identities( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_user_identities( search_string=search_string, starts_with=starts_with, @@ -4264,8 +4237,7 @@ def get_user_identities_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_user_identities_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -4371,8 +4343,7 @@ def get_user_identity_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_user_identity_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -4623,7 +4594,7 @@ def create_contribution_record(self, actor_profile_guid: str, body: Optional[dic } } """ - return asyncio.run(self._async_create_contribution_record(actor_profile_guid, body)) + return run_sync(self._async_create_contribution_record(actor_profile_guid, body)) @dynamic_catch async def _async_update_contribution_record(self, contribution_record_guid: str, body: Optional[dict | UpdateElementRequestBody] = None) -> None: @@ -4744,7 +4715,7 @@ def update_contribution_record(self, contribution_record_guid: str, body: Option "forDuplicateProcessing" : false } """ - return asyncio.run(self._async_update_contribution_record(contribution_record_guid, body)) + return run_sync(self._async_update_contribution_record(contribution_record_guid, body)) @dynamic_catch async def _async_delete_contribution_record(self, contribution_record_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: @@ -4825,7 +4796,7 @@ def delete_contribution_record(self, contribution_record_guid: str, body: Option "forDuplicateProcessing" : false } """ - return asyncio.run(self._async_delete_contribution_record(contribution_record_guid, body)) + return run_sync(self._async_delete_contribution_record(contribution_record_guid, body)) @dynamic_catch async def _async_get_contribution_records_by_name( @@ -4956,8 +4927,7 @@ def get_contribution_records_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_contribution_records_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -5134,8 +5104,7 @@ def find_contribution_records( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_contribution_records( search_string=search_string, starts_with=starts_with, @@ -5219,8 +5188,7 @@ def find_all_contribution_records( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_all_contribution_records( start_from=start_from, page_size=page_size, @@ -5319,8 +5287,7 @@ def get_contribution_record_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_contribution_record_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -5478,7 +5445,7 @@ def create_contact_details(self, body: Optional[dict | NewElementRequestBody] = } } """ - return asyncio.run(self._async_create_contact_details(body)) + return run_sync(self._async_create_contact_details(body)) @dynamic_catch async def _async_create_contact_details_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str: @@ -5615,7 +5582,7 @@ def create_contact_details_from_template(self, body: Optional[dict | TemplateReq } } """ - return asyncio.run(self._async_create_contact_details_from_template(body)) + return run_sync(self._async_create_contact_details_from_template(body)) @dynamic_catch async def _async_update_contact_details(self, contact_details_guid: str, body: Optional[dict | UpdateElementRequestBody] = None) -> None: @@ -5738,7 +5705,7 @@ def update_contact_details(self, contact_details_guid: str, body: Optional[dict "forDuplicateProcessing" : false } """ - return asyncio.run(self._async_update_contact_details(contact_details_guid, body)) + return run_sync(self._async_update_contact_details(contact_details_guid, body)) @dynamic_catch async def _async_delete_contact_details(self, contact_details_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: @@ -5819,7 +5786,7 @@ def delete_contact_details(self, contact_details_guid: str, body: Optional[dict "forDuplicateProcessing" : false } """ - return asyncio.run(self._async_delete_contact_details(contact_details_guid, body)) + return run_sync(self._async_delete_contact_details(contact_details_guid, body)) @dynamic_catch async def _async_link_contact_details(self, element_guid: str, contact_details_guid: str, @@ -5918,8 +5885,7 @@ def link_contact_details(self, element_guid: str, contact_details_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_contact_details(element_guid, contact_details_guid, body)) + run_sync(self._async_link_contact_details(element_guid, contact_details_guid, body)) @dynamic_catch async def _async_detach_contact_details(self, element_guid: str, contact_details_guid: str, @@ -6008,8 +5974,7 @@ def detach_contact_details(self, element_guid: str, contact_details_guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_contact_details(element_guid, contact_details_guid, body)) + run_sync(self._async_detach_contact_details(element_guid, contact_details_guid, body)) @dynamic_catch async def _async_get_contact_details_by_name( @@ -6140,8 +6105,7 @@ def get_contact_details_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_contact_details_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -6318,8 +6282,7 @@ def find_contact_details( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_contact_details( search_string=search_string, starts_with=starts_with, @@ -6431,8 +6394,7 @@ def get_contact_details_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_contact_details_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -6535,7 +6497,7 @@ def create_perspective(self, body: Optional[dict | NewElementRequestBody] = None } } """ - return asyncio.run(self._async_create_perspective(body)) + return run_sync(self._async_create_perspective(body)) @dynamic_catch async def _async_create_perspective_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str: @@ -6633,7 +6595,7 @@ def create_perspective_from_template(self, body: Optional[dict | TemplateRequest } } """ - return asyncio.run(self._async_create_perspective_from_template(body)) + return run_sync(self._async_create_perspective_from_template(body)) @dynamic_catch async def _async_update_perspective(self, perspective_guid: str, body: Optional[dict | UpdateElementRequestBody] = None) -> None: @@ -6732,7 +6694,7 @@ def update_perspective(self, perspective_guid: str, body: Optional[dict | Update } } """ - return asyncio.run(self._async_update_perspective(perspective_guid, body)) + return run_sync(self._async_update_perspective(perspective_guid, body)) @dynamic_catch async def _async_delete_perspective(self, perspective_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: @@ -6815,7 +6777,7 @@ def delete_perspective(self, perspective_guid: str, body: Optional[dict | Delete "forDuplicateProcessing" : false } """ - return asyncio.run(self._async_delete_perspective(perspective_guid, body)) + return run_sync(self._async_delete_perspective(perspective_guid, body)) @dynamic_catch async def _async_get_perspectives_by_name( @@ -6946,8 +6908,7 @@ def get_perspectives_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_perspectives_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -7124,8 +7085,7 @@ def find_perspectives( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_perspectives( search_string=search_string, starts_with=starts_with, @@ -7237,8 +7197,7 @@ def get_perspective_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_perspective_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -7341,7 +7300,7 @@ def create_skill(self, body: Optional[dict | NewElementRequestBody] = None) -> s } } """ - return asyncio.run(self._async_create_skill(body)) + return run_sync(self._async_create_skill(body)) @dynamic_catch async def _async_create_skill_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str: @@ -7439,7 +7398,7 @@ def create_skill_from_template(self, body: Optional[dict | TemplateRequestBody] } } """ - return asyncio.run(self._async_create_skill_from_template(body)) + return run_sync(self._async_create_skill_from_template(body)) @dynamic_catch async def _async_update_skill(self, skill_guid: str, body: Optional[dict | UpdateElementRequestBody] = None) -> None: @@ -7538,7 +7497,7 @@ def update_skill(self, skill_guid: str, body: Optional[dict | UpdateElementReque } } """ - return asyncio.run(self._async_update_skill(skill_guid, body)) + return run_sync(self._async_update_skill(skill_guid, body)) @dynamic_catch async def _async_delete_skill(self, skill_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: @@ -7621,7 +7580,7 @@ def delete_skill(self, skill_guid: str, body: Optional[dict | DeleteElementReque "forDuplicateProcessing" : false } """ - return asyncio.run(self._async_delete_skill(skill_guid, body)) + return run_sync(self._async_delete_skill(skill_guid, body)) @dynamic_catch async def _async_get_skills_by_name( @@ -7752,8 +7711,7 @@ def get_skills_by_name( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_skills_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -7930,8 +7888,7 @@ def find_skills( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_skills( search_string=search_string, starts_with=starts_with, @@ -8043,8 +8000,7 @@ def get_skill_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_skill_by_guid( guid=guid, include_only_relationships=include_only_relationships, diff --git a/pyegeria/omvs/asset_catalog.py b/pyegeria/omvs/asset_catalog.py index 161a7861..18dd2a89 100644 --- a/pyegeria/omvs/asset_catalog.py +++ b/pyegeria/omvs/asset_catalog.py @@ -22,6 +22,7 @@ from pyegeria.core._globals import max_paging_size from pyegeria.core._globals import NO_ELEMENTS_FOUND, NO_ASSETS_FOUND from typing import Any, Optional +from pyegeria.core.async_runner import run_sync class AssetCatalog(ServerClient): """ @@ -267,8 +268,7 @@ def find_in_asset_domain( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_in_asset_domain( search_string=search_string, starts_with=starts_with, @@ -390,8 +390,7 @@ def get_asset_graph_by_guid( The principle specified by the user_id does not have authorization. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_asset_graph_by_guid( guid=guid, start_from=start_from, @@ -616,8 +615,7 @@ def get_asset_lineage_graph_by_guid( If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_asset_lineage_graph_by_guid( guid=guid, effective_time=effective_time, @@ -847,8 +845,7 @@ def get_assets_by_metadata_collection_id( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_assets_by_metadata_collection_id( metadata_collection_id=metadata_collection_id, metadata_element_type_name=metadata_element_type_name, @@ -902,8 +899,7 @@ def get_asset_types(self) -> list | str: If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_asset_types()) + response = run_sync(self._async_get_asset_types()) return response diff --git a/pyegeria/omvs/asset_maker.py b/pyegeria/omvs/asset_maker.py index f1f0fb18..cd7dea68 100644 --- a/pyegeria/omvs/asset_maker.py +++ b/pyegeria/omvs/asset_maker.py @@ -37,6 +37,7 @@ ) from pyegeria.core.utils import dynamic_catch from pyegeria.view.base_report_formats import select_report_spec, get_report_spec_match +from pyegeria.core.async_runner import run_sync class AssetProperties(ReferenceableProperties): """Properties for Asset elements""" @@ -733,8 +734,7 @@ def get_assets_by_name( "sequencingProperty" : "qualifiedName" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_assets_by_name(filter_string=filter_string, metadata_element_type_name=metadata_element_type_name, metadata_element_subtypes=metadata_element_subtypes, @@ -1073,8 +1073,7 @@ def get_asset_by_guid( "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_asset_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -1210,8 +1209,7 @@ def add_catalog_target( } } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_add_catalog_target( integration_connector_guid, metadata_element_guid, body ) @@ -1326,8 +1324,7 @@ def update_catalog_target( "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_catalog_target(relationship_guid, body) ) @@ -1424,8 +1421,7 @@ def get_catalog_target( ----- See: https://egeria-project.org/concepts/integration-connector/ """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_catalog_target(guid=guid, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, body=body, **kwargs) @@ -1542,8 +1538,7 @@ def get_catalog_targets( ----- See: https://egeria-project.org/concepts/integration-connector/ """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_catalog_targets( integration_connector_guid=integration_connector_guid, graph_query_depth=graph_query_depth, @@ -1617,8 +1612,7 @@ def remove_catalog_target( ----- See: https://egeria-project.org/concepts/integration-connector/ """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_catalog_target(relationship_guid, body) ) @@ -1704,8 +1698,7 @@ def link_supported_governance_service( See _async_link_supported_governance_service for parameter and return details. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_supported_governance_service( governance_engine_guid, governance_service_guid, body ) @@ -1776,8 +1769,7 @@ def update_supported_governance_service( See _async_update_supported_governance_service for parameter details. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_supported_governance_service(relationship_guid, body) ) @@ -1823,8 +1815,7 @@ def detach_supported_governance_service( See _async_detach_supported_governance_service for parameter details. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_supported_governance_service(relationship_guid, body) ) @@ -1907,8 +1898,7 @@ def detach_catalog_target( "class" : "DeleteRelationshipRequestBody" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_catalog_target( integration_connector_guid, metadata_element_guid, body ) @@ -2151,8 +2141,7 @@ def find_data_assets( "pageSize": 0 } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_data_assets( search_string=search_string, content_status_list=content_status_list, @@ -2301,8 +2290,7 @@ def get_data_assets_by_category( "pageSize": 0 } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_data_assets_by_category( category=category, content_status_list=content_status_list, @@ -2411,8 +2399,7 @@ def link_data_set_content( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_data_set_content(data_set_guid, data_content_asset_guid, body) ) @@ -2475,8 +2462,7 @@ def detach_data_set_content( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_data_set_content(data_set_guid, data_content_asset_guid, body) ) @@ -2542,8 +2528,7 @@ def update_data_set_content( body: dict | UpdateRelationshipRequestBody, optional The properties to update. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_data_set_content(data_set_content_guid, body)) + run_sync(self._async_update_data_set_content(data_set_content_guid, body)) @dynamic_catch async def _async_detach_data_set_content_relationship( @@ -2589,8 +2574,7 @@ def detach_data_set_content_relationship( body: dict | DeleteRelationshipRequestBody, optional Additional parameters for the delete operation. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_data_set_content_relationship(data_set_content_guid, body)) + run_sync(self._async_detach_data_set_content_relationship(data_set_content_guid, body)) # # Report Methods @@ -2687,8 +2671,7 @@ def link_report_originator( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_report_originator(originator_guid, report_guid, body) ) @@ -2751,8 +2734,7 @@ def unlink_report_originator( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_report_originator(originator_guid, report_guid, body) ) @@ -2847,8 +2829,7 @@ def link_report_dependency( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_report_dependency(prior_report_guid, report_guid, body) ) @@ -2911,8 +2892,7 @@ def unlink_report_dependency( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_report_dependency(prior_report_guid, report_guid, body) ) @@ -3007,8 +2987,7 @@ def link_report_subject( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_report_subject(subject_guid, report_guid, body) ) @@ -3071,8 +3050,7 @@ def unlink_report_subject( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_report_subject(subject_guid, report_guid, body) ) @@ -3283,8 +3261,7 @@ def find_infrastructure( "pageSize": 0 } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_infrastructure( search_string=search_string, deployment_status_list=deployment_status_list, @@ -3433,8 +3410,7 @@ def get_infrastructure_by_category( "pageSize": 0 } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_infrastructure_by_category( category=category, deployment_status_list=deployment_status_list, @@ -3544,8 +3520,7 @@ def deploy_it_asset( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_deploy_it_asset(asset_guid, destination_guid, body) ) @@ -3608,8 +3583,7 @@ def undeploy_it_asset( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_undeploy_it_asset(asset_guid, destination_guid, body) ) @@ -3704,8 +3678,7 @@ def link_software_capability_to_asset( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_software_capability_to_asset(asset_guid, capability_guid, body) ) @@ -3768,8 +3741,7 @@ def detach_software_capability_from_asset( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_software_capability_from_asset(asset_guid, capability_guid, body) ) @@ -3952,8 +3924,7 @@ def find_processes( "pageSize": 0 } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_processes( search_string=search_string, activity_status_list=activity_status_list, @@ -4095,8 +4066,7 @@ def get_processes_by_category( "pageSize": 0 } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_processes_by_category( category=category, activity_status_list=activity_status_list, @@ -4267,8 +4237,7 @@ def create_action(self, body: dict | ActionRequestBody) -> str: "assignToActorGUID" : "add guid of actor that will be assigned this action (AssignmentScope relationship)" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_action(body)) + return run_sync(self._async_create_action(body)) @dynamic_catch async def _async_add_action_target( @@ -4361,8 +4330,7 @@ def add_action_target( "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_add_action_target(action_guid, metadata_element_guid, body) ) @@ -4435,8 +4403,7 @@ def update_action_target_properties( "effectiveTime": "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_action_target_properties(action_target_guid, body) ) @@ -4516,8 +4483,7 @@ def get_action_target( "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_action_target(action_target_guid=action_target_guid, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, body=body, **kwargs) ) @@ -4619,8 +4585,7 @@ def get_action_targets( "activityStatusList": ["IN_PROGRESS"] } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_action_targets( action_guid=action_guid, activity_status_list=activity_status_list, @@ -4734,8 +4699,7 @@ def get_actions_for_action_target( "activityStatusList": ["IN_PROGRESS"] } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actions_for_action_target( metadata_element_guid=metadata_element_guid, activity_status_list=activity_status_list, @@ -4811,8 +4775,7 @@ def assign_action( "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_assign_action(action_guid, actor_guid, body)) + run_sync(self._async_assign_action(action_guid, actor_guid, body)) @dynamic_catch async def _async_reassign_action( @@ -4867,8 +4830,7 @@ def reassign_action( "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_reassign_action(action_guid, actor_guid, body)) + run_sync(self._async_reassign_action(action_guid, actor_guid, body)) @dynamic_catch async def _async_unassign_action( @@ -4918,8 +4880,7 @@ def unassign_action( "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_unassign_action(action_guid, actor_guid, body)) + run_sync(self._async_unassign_action(action_guid, actor_guid, body)) @dynamic_catch async def _async_get_assigned_actions( @@ -5018,8 +4979,7 @@ def get_assigned_actions( "activityStatusList": ["IN_PROGRESS"] } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_assigned_actions( actor_guid=actor_guid, activity_status_list=activity_status_list, @@ -5133,8 +5093,7 @@ def get_actions_for_sponsor( "activityStatusList": ["IN_PROGRESS"] } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actions_for_sponsor( metadata_element_guid=metadata_element_guid, activity_status_list=activity_status_list, @@ -5248,8 +5207,7 @@ def get_actions_for_requester( "activityStatusList": ["IN_PROGRESS"] } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_actions_for_requester( metadata_element_guid=metadata_element_guid, activity_status_list=activity_status_list, @@ -5352,8 +5310,7 @@ def create_software_capability( } } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_software_capability(body)) + return run_sync(self._async_create_software_capability(body)) @dynamic_catch async def _async_create_software_capability_from_template( @@ -5434,8 +5391,7 @@ def create_software_capability_from_template( } } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_software_capability_from_template(body)) + return run_sync(self._async_create_software_capability_from_template(body)) @dynamic_catch async def _async_update_software_capability( @@ -5516,8 +5472,7 @@ def update_software_capability( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_software_capability(software_capability_guid, body) ) @@ -5619,8 +5574,7 @@ def get_software_capability_by_guid( ----- See: https://egeria-project.org/concepts/software-capability """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_software_capability_by_guid( guid=guid, metadata_element_type_name=metadata_element_type_name, @@ -5885,8 +5839,7 @@ def find_software_capabilities( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_software_capabilities( search_string=search_string, starts_with=starts_with, @@ -6021,8 +5974,7 @@ def get_software_capabilities_by_name( ----- See: https://egeria-project.org/concepts/software-capability """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_software_capabilities_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -6140,8 +6092,7 @@ def get_software_capabilities_by_deployed_implementation_type( ----- See: https://egeria-project.org/concepts/software-capability """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_software_capabilities_by_deployed_implementation_type( deployed_implementation_type=deployed_implementation_type, metadata_element_type_name=metadata_element_type_name, @@ -6249,8 +6200,7 @@ def get_software_capabilities_for_infrastructure( ----- See: https://egeria-project.org/concepts/software-capability """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_software_capabilities_for_infrastructure( infrastructure_guid=infrastructure_guid, graph_query_depth=graph_query_depth, @@ -6366,8 +6316,7 @@ def add_capability_asset_use( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_capability_asset_use(software_capability_guid, asset_guid, body) ) @@ -6430,8 +6379,7 @@ def remove_capability_asset_use( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_capability_asset_use(software_capability_guid, asset_guid, body) ) @@ -6529,8 +6477,7 @@ def get_capability_use( ----- See: https://egeria-project.org/concepts/software-capability """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_capability_use( asset_guid=asset_guid, graph_query_depth=graph_query_depth, @@ -6637,8 +6584,7 @@ def get_governance_engines( ----- See: https://egeria-project.org/concepts/governance-engine """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_governance_engines( governance_service_guid=governance_service_guid, graph_query_depth=graph_query_depth, @@ -6717,8 +6663,7 @@ def link_supported_governance_service( body: Optional[dict | NewRelationshipRequestBody] = None ) -> str: """Create a relationship that registers a governance service with a governance engine.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_supported_governance_service(governance_engine_guid, governance_service_guid, body) ) @@ -6774,8 +6719,7 @@ def update_supported_governance_service( self, relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None ) -> None: """Update the properties of a SupportedGovernanceService relationship.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_supported_governance_service(relationship_guid, body)) + run_sync(self._async_update_supported_governance_service(relationship_guid, body)) @dynamic_catch async def _async_detach_supported_governance_service( @@ -6808,8 +6752,7 @@ def detach_supported_governance_service( self, relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None ) -> None: """Detach a governance service from a governance engine.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_supported_governance_service(relationship_guid, body)) + run_sync(self._async_detach_supported_governance_service(relationship_guid, body)) @dynamic_catch async def _async_get_integration_groups( @@ -6905,8 +6848,7 @@ def get_integration_groups( ----- See: https://egeria-project.org/concepts/integration-group """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_integration_groups( integration_connector_guid=integration_connector_guid, graph_query_depth=graph_query_depth, @@ -7010,8 +6952,7 @@ async def _async_link_api_endpoint(self, deployed_api_guid: str, endpoint_guid: def link_api_endpoint(self, deployed_api_guid: str, endpoint_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a network endpoint to a deployed API (APIEndpoint relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_api_endpoint(deployed_api_guid, endpoint_guid, body)) + run_sync(self._async_link_api_endpoint(deployed_api_guid, endpoint_guid, body)) @dynamic_catch async def _async_detach_api_endpoint(self, deployed_api_guid: str, endpoint_guid: str, @@ -7024,8 +6965,7 @@ async def _async_detach_api_endpoint(self, deployed_api_guid: str, endpoint_guid def detach_api_endpoint(self, deployed_api_guid: str, endpoint_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a network endpoint from a deployed API.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_api_endpoint(deployed_api_guid, endpoint_guid, body)) + run_sync(self._async_detach_api_endpoint(deployed_api_guid, endpoint_guid, body)) @dynamic_catch async def _async_link_process_hierarchy(self, parent_process_guid: str, child_process_guid: str, @@ -7038,8 +6978,7 @@ async def _async_link_process_hierarchy(self, parent_process_guid: str, child_pr def link_process_hierarchy(self, parent_process_guid: str, child_process_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a child process to its parent process (ProcessHierarchy relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_process_hierarchy(parent_process_guid, child_process_guid, body)) + run_sync(self._async_link_process_hierarchy(parent_process_guid, child_process_guid, body)) @dynamic_catch async def _async_detach_process_hierarchy(self, parent_process_guid: str, child_process_guid: str, @@ -7052,8 +6991,7 @@ async def _async_detach_process_hierarchy(self, parent_process_guid: str, child_ def detach_process_hierarchy(self, parent_process_guid: str, child_process_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a child process from its parent process.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_process_hierarchy(parent_process_guid, child_process_guid, body)) + run_sync(self._async_detach_process_hierarchy(parent_process_guid, child_process_guid, body)) @dynamic_catch async def _async_link_nested_files(self, folder_guid: str, file_guid: str, @@ -7066,8 +7004,7 @@ async def _async_link_nested_files(self, folder_guid: str, file_guid: str, def link_nested_files(self, folder_guid: str, file_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a file to the folder that contains it (NestedFile relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_nested_files(folder_guid, file_guid, body)) + run_sync(self._async_link_nested_files(folder_guid, file_guid, body)) @dynamic_catch async def _async_detach_nested_file(self, folder_guid: str, file_guid: str, @@ -7080,8 +7017,7 @@ async def _async_detach_nested_file(self, folder_guid: str, file_guid: str, def detach_nested_file(self, folder_guid: str, file_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a file from the folder that contains it.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_nested_file(folder_guid, file_guid, body)) + run_sync(self._async_detach_nested_file(folder_guid, file_guid, body)) @dynamic_catch async def _async_link_linked_files(self, folder_guid: str, file_guid: str, @@ -7094,8 +7030,7 @@ async def _async_link_linked_files(self, folder_guid: str, file_guid: str, def link_linked_files(self, folder_guid: str, file_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a file referenced by (but not contained in) a folder (LinkedFile relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_linked_files(folder_guid, file_guid, body)) + run_sync(self._async_link_linked_files(folder_guid, file_guid, body)) @dynamic_catch async def _async_detach_linked_file(self, folder_guid: str, file_guid: str, @@ -7108,8 +7043,7 @@ async def _async_detach_linked_file(self, folder_guid: str, file_guid: str, def detach_linked_file(self, folder_guid: str, file_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a referenced file from a folder.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_linked_file(folder_guid, file_guid, body)) + run_sync(self._async_detach_linked_file(folder_guid, file_guid, body)) @dynamic_catch async def _async_link_folder_hierarchy(self, parent_folder_guid: str, child_folder_guid: str, @@ -7122,8 +7056,7 @@ async def _async_link_folder_hierarchy(self, parent_folder_guid: str, child_fold def link_folder_hierarchy(self, parent_folder_guid: str, child_folder_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a child folder to its parent folder (FolderHierarchy relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_folder_hierarchy(parent_folder_guid, child_folder_guid, body)) + run_sync(self._async_link_folder_hierarchy(parent_folder_guid, child_folder_guid, body)) @dynamic_catch async def _async_detach_folder_hierarchy(self, parent_folder_guid: str, child_folder_guid: str, @@ -7136,8 +7069,7 @@ async def _async_detach_folder_hierarchy(self, parent_folder_guid: str, child_fo def detach_folder_hierarchy(self, parent_folder_guid: str, child_folder_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a child folder from its parent folder.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_folder_hierarchy(parent_folder_guid, child_folder_guid, body)) + run_sync(self._async_detach_folder_hierarchy(parent_folder_guid, child_folder_guid, body)) @dynamic_catch async def _async_link_impacted_resource(self, resource_guid: str, incident_report_guid: str, @@ -7150,8 +7082,7 @@ async def _async_link_impacted_resource(self, resource_guid: str, incident_repor def link_impacted_resource(self, resource_guid: str, incident_report_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a resource to an incident report that affects it (ImpactedResource relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_impacted_resource(resource_guid, incident_report_guid, body)) + run_sync(self._async_link_impacted_resource(resource_guid, incident_report_guid, body)) @dynamic_catch async def _async_detach_impacted_resource(self, resource_guid: str, incident_report_guid: str, @@ -7164,8 +7095,7 @@ async def _async_detach_impacted_resource(self, resource_guid: str, incident_rep def detach_impacted_resource(self, resource_guid: str, incident_report_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a resource from an incident report.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_impacted_resource(resource_guid, incident_report_guid, body)) + run_sync(self._async_detach_impacted_resource(resource_guid, incident_report_guid, body)) @dynamic_catch async def _async_link_archive_contents(self, archive_file_guid: str, collection_guid: str, @@ -7178,8 +7108,7 @@ async def _async_link_archive_contents(self, archive_file_guid: str, collection_ def link_archive_contents(self, archive_file_guid: str, collection_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a collection as the contents of an archive file (ArchiveContents relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_archive_contents(archive_file_guid, collection_guid, body)) + run_sync(self._async_link_archive_contents(archive_file_guid, collection_guid, body)) @dynamic_catch async def _async_detach_archive_contents(self, archive_file_guid: str, collection_guid: str, @@ -7192,8 +7121,7 @@ async def _async_detach_archive_contents(self, archive_file_guid: str, collectio def detach_archive_contents(self, archive_file_guid: str, collection_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a collection from an archive file.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_archive_contents(archive_file_guid, collection_guid, body)) + run_sync(self._async_detach_archive_contents(archive_file_guid, collection_guid, body)) @dynamic_catch async def _async_link_associated_log(self, element_guid: str, log_asset_guid: str, @@ -7206,8 +7134,7 @@ async def _async_link_associated_log(self, element_guid: str, log_asset_guid: st def link_associated_log(self, element_guid: str, log_asset_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a log file asset to the element it logs activity for (AssociatedLog relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_associated_log(element_guid, log_asset_guid, body)) + run_sync(self._async_link_associated_log(element_guid, log_asset_guid, body)) @dynamic_catch async def _async_detach_associated_log(self, element_guid: str, log_asset_guid: str, @@ -7220,8 +7147,7 @@ async def _async_detach_associated_log(self, element_guid: str, log_asset_guid: def detach_associated_log(self, element_guid: str, log_asset_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a log file asset from the element it logs activity for.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_associated_log(element_guid, log_asset_guid, body)) + run_sync(self._async_detach_associated_log(element_guid, log_asset_guid, body)) @dynamic_catch async def _async_link_linked_media(self, media_file_guid: str, linked_media_file_guid: str, @@ -7234,8 +7160,7 @@ async def _async_link_linked_media(self, media_file_guid: str, linked_media_file def link_linked_media(self, media_file_guid: str, linked_media_file_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a related media file to another media file (LinkedMedia relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_linked_media(media_file_guid, linked_media_file_guid, body)) + run_sync(self._async_link_linked_media(media_file_guid, linked_media_file_guid, body)) @dynamic_catch async def _async_detach_linked_media(self, media_file_guid: str, linked_media_file_guid: str, @@ -7248,8 +7173,7 @@ async def _async_detach_linked_media(self, media_file_guid: str, linked_media_fi def detach_linked_media(self, media_file_guid: str, linked_media_file_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a related media file from another media file.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_linked_media(media_file_guid, linked_media_file_guid, body)) + run_sync(self._async_detach_linked_media(media_file_guid, linked_media_file_guid, body)) @dynamic_catch async def _async_link_process_port(self, process_guid: str, port_guid: str, @@ -7262,8 +7186,7 @@ async def _async_link_process_port(self, process_guid: str, port_guid: str, def link_process_port(self, process_guid: str, port_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a port to the process it belongs to (ProcessPort relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_process_port(process_guid, port_guid, body)) + run_sync(self._async_link_process_port(process_guid, port_guid, body)) @dynamic_catch async def _async_detach_process_port(self, process_guid: str, port_guid: str, @@ -7276,8 +7199,7 @@ async def _async_detach_process_port(self, process_guid: str, port_guid: str, def detach_process_port(self, process_guid: str, port_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a port from the process it belongs to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_process_port(process_guid, port_guid, body)) + run_sync(self._async_detach_process_port(process_guid, port_guid, body)) @dynamic_catch async def _async_link_sample_data(self, element_guid: str, sample_data_guid: str, @@ -7290,8 +7212,7 @@ async def _async_link_sample_data(self, element_guid: str, sample_data_guid: str def link_sample_data(self, element_guid: str, sample_data_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a data resource as sample data for an element (SampleData relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_sample_data(element_guid, sample_data_guid, body)) + run_sync(self._async_link_sample_data(element_guid, sample_data_guid, body)) @dynamic_catch async def _async_detach_sample_data(self, element_guid: str, sample_data_guid: str, @@ -7304,8 +7225,7 @@ async def _async_detach_sample_data(self, element_guid: str, sample_data_guid: s def detach_sample_data(self, element_guid: str, sample_data_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a sample data resource from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_sample_data(element_guid, sample_data_guid, body)) + run_sync(self._async_detach_sample_data(element_guid, sample_data_guid, body)) @dynamic_catch async def _async_link_port_delegation(self, delegating_from_port_guid: str, delegating_to_port_guid: str, @@ -7318,8 +7238,7 @@ async def _async_link_port_delegation(self, delegating_from_port_guid: str, dele def link_port_delegation(self, delegating_from_port_guid: str, delegating_to_port_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Attach a port to the port it delegates to (PortDelegation relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_port_delegation(delegating_from_port_guid, delegating_to_port_guid, body)) + run_sync(self._async_link_port_delegation(delegating_from_port_guid, delegating_to_port_guid, body)) @dynamic_catch async def _async_detach_port_delegation(self, delegating_from_port_guid: str, delegating_to_port_guid: str, @@ -7332,8 +7251,7 @@ async def _async_detach_port_delegation(self, delegating_from_port_guid: str, de def detach_port_delegation(self, delegating_from_port_guid: str, delegating_to_port_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Detach a port from the port it delegates to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_port_delegation(delegating_from_port_guid, delegating_to_port_guid, body)) + run_sync(self._async_detach_port_delegation(delegating_from_port_guid, delegating_to_port_guid, body)) @dynamic_catch async def _async_link_registered_integration_connector(self, integration_group_guid: str, integration_connector_guid: str, @@ -7347,8 +7265,7 @@ async def _async_link_registered_integration_connector(self, integration_group_g def link_registered_integration_connector(self, integration_group_guid: str, integration_connector_guid: str, body: dict | NewRelationshipRequestBody | None = None) -> None: """Register an integration connector with an integration group (RegisteredIntegrationConnector relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_registered_integration_connector( + run_sync(self._async_link_registered_integration_connector( integration_group_guid, integration_connector_guid, body)) @dynamic_catch @@ -7363,8 +7280,7 @@ async def _async_detach_registered_integration_connector(self, integration_group def detach_registered_integration_connector(self, integration_group_guid: str, integration_connector_guid: str, body: dict | DeleteRelationshipRequestBody | None = None) -> None: """Deregister an integration connector from an integration group.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_registered_integration_connector( + run_sync(self._async_detach_registered_integration_connector( integration_group_guid, integration_connector_guid, body)) @dynamic_catch @@ -7380,8 +7296,7 @@ async def _async_set_asset_as_audit_log(self, asset_guid: str, def set_asset_as_audit_log(self, asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify an asset as holding audit log content.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_asset_as_audit_log(asset_guid, body)) + run_sync(self._async_set_asset_as_audit_log(asset_guid, body)) @dynamic_catch async def _async_clear_asset_as_audit_log(self, asset_guid: str, @@ -7394,8 +7309,7 @@ async def _async_clear_asset_as_audit_log(self, asset_guid: str, def clear_asset_as_audit_log(self, asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the AuditLog classification from an asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_asset_as_audit_log(asset_guid, body)) + run_sync(self._async_clear_asset_as_audit_log(asset_guid, body)) @dynamic_catch async def _async_set_asset_as_lineage_log(self, asset_guid: str, @@ -7410,8 +7324,7 @@ async def _async_set_asset_as_lineage_log(self, asset_guid: str, def set_asset_as_lineage_log(self, asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify an asset as holding lineage log content.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_asset_as_lineage_log(asset_guid, body)) + run_sync(self._async_set_asset_as_lineage_log(asset_guid, body)) @dynamic_catch async def _async_clear_asset_as_lineage_log(self, asset_guid: str, @@ -7424,8 +7337,7 @@ async def _async_clear_asset_as_lineage_log(self, asset_guid: str, def clear_asset_as_lineage_log(self, asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the LineageLog classification from an asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_asset_as_lineage_log(asset_guid, body)) + run_sync(self._async_clear_asset_as_lineage_log(asset_guid, body)) @dynamic_catch async def _async_set_asset_as_metering_log(self, asset_guid: str, @@ -7440,8 +7352,7 @@ async def _async_set_asset_as_metering_log(self, asset_guid: str, def set_asset_as_metering_log(self, asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify an asset as holding metering log content.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_asset_as_metering_log(asset_guid, body)) + run_sync(self._async_set_asset_as_metering_log(asset_guid, body)) @dynamic_catch async def _async_clear_asset_as_metering_log(self, asset_guid: str, @@ -7454,8 +7365,7 @@ async def _async_clear_asset_as_metering_log(self, asset_guid: str, def clear_asset_as_metering_log(self, asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the MeteringLog classification from an asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_asset_as_metering_log(asset_guid, body)) + run_sync(self._async_clear_asset_as_metering_log(asset_guid, body)) @dynamic_catch async def _async_set_asset_as_security_log(self, asset_guid: str, @@ -7470,8 +7380,7 @@ async def _async_set_asset_as_security_log(self, asset_guid: str, def set_asset_as_security_log(self, asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify an asset as holding security log content.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_asset_as_security_log(asset_guid, body)) + run_sync(self._async_set_asset_as_security_log(asset_guid, body)) @dynamic_catch async def _async_clear_asset_as_security_log(self, asset_guid: str, @@ -7484,8 +7393,7 @@ async def _async_clear_asset_as_security_log(self, asset_guid: str, def clear_asset_as_security_log(self, asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the SecurityLog classification from an asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_asset_as_security_log(asset_guid, body)) + run_sync(self._async_clear_asset_as_security_log(asset_guid, body)) @dynamic_catch async def _async_set_asset_as_exception_backlog(self, asset_guid: str, @@ -7500,8 +7408,7 @@ async def _async_set_asset_as_exception_backlog(self, asset_guid: str, def set_asset_as_exception_backlog(self, asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify an asset as holding exception backlog content.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_asset_as_exception_backlog(asset_guid, body)) + run_sync(self._async_set_asset_as_exception_backlog(asset_guid, body)) @dynamic_catch async def _async_clear_asset_as_exception_backlog(self, asset_guid: str, @@ -7514,8 +7421,7 @@ async def _async_clear_asset_as_exception_backlog(self, asset_guid: str, def clear_asset_as_exception_backlog(self, asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the ExceptionBacklog classification from an asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_asset_as_exception_backlog(asset_guid, body)) + run_sync(self._async_clear_asset_as_exception_backlog(asset_guid, body)) @dynamic_catch async def _async_set_asset_as_log_analysis(self, asset_guid: str, @@ -7530,8 +7436,7 @@ async def _async_set_asset_as_log_analysis(self, asset_guid: str, def set_asset_as_log_analysis(self, asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify an asset as performing log analysis.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_asset_as_log_analysis(asset_guid, body)) + run_sync(self._async_set_asset_as_log_analysis(asset_guid, body)) @dynamic_catch async def _async_clear_asset_as_log_analysis(self, asset_guid: str, @@ -7544,8 +7449,7 @@ async def _async_clear_asset_as_log_analysis(self, asset_guid: str, def clear_asset_as_log_analysis(self, asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the LogAnalysis classification from an asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_asset_as_log_analysis(asset_guid, body)) + run_sync(self._async_clear_asset_as_log_analysis(asset_guid, body)) @dynamic_catch async def _async_set_api_as_listener_interface(self, deployed_api_guid: str, @@ -7560,8 +7464,7 @@ async def _async_set_api_as_listener_interface(self, deployed_api_guid: str, def set_api_as_listener_interface(self, deployed_api_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify a deployed API as a listener interface.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_api_as_listener_interface(deployed_api_guid, body)) + run_sync(self._async_set_api_as_listener_interface(deployed_api_guid, body)) @dynamic_catch async def _async_clear_api_as_listener_interface(self, deployed_api_guid: str, @@ -7574,8 +7477,7 @@ async def _async_clear_api_as_listener_interface(self, deployed_api_guid: str, def clear_api_as_listener_interface(self, deployed_api_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the ListenerInterface classification from a deployed API.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_api_as_listener_interface(deployed_api_guid, body)) + run_sync(self._async_clear_api_as_listener_interface(deployed_api_guid, body)) @dynamic_catch async def _async_set_api_as_publisher_interface(self, deployed_api_guid: str, @@ -7590,8 +7492,7 @@ async def _async_set_api_as_publisher_interface(self, deployed_api_guid: str, def set_api_as_publisher_interface(self, deployed_api_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify a deployed API as a publisher interface.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_api_as_publisher_interface(deployed_api_guid, body)) + run_sync(self._async_set_api_as_publisher_interface(deployed_api_guid, body)) @dynamic_catch async def _async_clear_api_as_publisher_interface(self, deployed_api_guid: str, @@ -7604,8 +7505,7 @@ async def _async_clear_api_as_publisher_interface(self, deployed_api_guid: str, def clear_api_as_publisher_interface(self, deployed_api_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the PublisherInterface classification from a deployed API.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_api_as_publisher_interface(deployed_api_guid, body)) + run_sync(self._async_clear_api_as_publisher_interface(deployed_api_guid, body)) @dynamic_catch async def _async_set_api_as_request_response_interface(self, deployed_api_guid: str, @@ -7620,8 +7520,7 @@ async def _async_set_api_as_request_response_interface(self, deployed_api_guid: def set_api_as_request_response_interface(self, deployed_api_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify a deployed API as a request-response interface.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_api_as_request_response_interface(deployed_api_guid, body)) + run_sync(self._async_set_api_as_request_response_interface(deployed_api_guid, body)) @dynamic_catch async def _async_clear_api_as_request_response_interface(self, deployed_api_guid: str, @@ -7634,8 +7533,7 @@ async def _async_clear_api_as_request_response_interface(self, deployed_api_guid def clear_api_as_request_response_interface(self, deployed_api_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the RequestResponseInterface classification from a deployed API.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_api_as_request_response_interface(deployed_api_guid, body)) + run_sync(self._async_clear_api_as_request_response_interface(deployed_api_guid, body)) @dynamic_catch async def _async_set_data_asset_encoding(self, data_asset_guid: str, @@ -7650,8 +7548,7 @@ async def _async_set_data_asset_encoding(self, data_asset_guid: str, def set_data_asset_encoding(self, data_asset_guid: str, body: dict | NewClassificationRequestBody | None = None) -> None: """Classify a data asset with its encoding details.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_data_asset_encoding(data_asset_guid, body)) + run_sync(self._async_set_data_asset_encoding(data_asset_guid, body)) @dynamic_catch async def _async_clear_data_asset_encoding(self, data_asset_guid: str, @@ -7664,5 +7561,4 @@ async def _async_clear_data_asset_encoding(self, data_asset_guid: str, def clear_data_asset_encoding(self, data_asset_guid: str, body: dict | DeleteClassificationRequestBody | None = None) -> None: """Remove the DataAssetEncoding classification from a data asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_data_asset_encoding(data_asset_guid, body)) + run_sync(self._async_clear_data_asset_encoding(data_asset_guid, body)) diff --git a/pyegeria/omvs/automated_curation.py b/pyegeria/omvs/automated_curation.py index cd3ad044..7b5e948e 100644 --- a/pyegeria/omvs/automated_curation.py +++ b/pyegeria/omvs/automated_curation.py @@ -32,6 +32,7 @@ populate_columns_from_properties, get_required_relationships, ) +from pyegeria.core.async_runner import run_sync settings.Logging.console_logging_level = "ERROR" @@ -668,8 +669,7 @@ def create_elem_from_template(self, body: Optional[dict | TemplateRequestBody] = "effectiveTime" : "" } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_elem_from_template(body) ) return response @@ -846,8 +846,7 @@ def create_secrets_store_element_from_template( } ``` """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_secrets_store_element_from_template( file_path_name, file_name, description, version_identifier, file_system_name, file_type, file_extension, file_encoding, @@ -944,8 +943,7 @@ def create_kafka_server_element_from_template( str The GUID of the Kafka server element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_kafka_server_element_from_template( kafka_server, host_name, port, description, @@ -1053,8 +1051,7 @@ def create_csv_data_file_element_from_template( str The GUID of the CSV File element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_csv_data_file_element_from_template( file_name, file_type, file_path_name, version_identifier, file_encoding, file_extension, file_system_name, description @@ -1169,8 +1166,7 @@ def get_create_csv_data_file_element_from_template( str The GUID of the CSV File element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_create_csv_data_file_element_from_template( file_name, file_type, @@ -1315,8 +1311,7 @@ def create_postgres_server_element_from_template( str The GUID of the Postgres server element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_postgres_server_element_from_template( postgres_server, host_name, port, db_user, db_pwd, description, @@ -1450,8 +1445,7 @@ def create_postgres_database_element_from_template( str The GUID of the Postgres database element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_postgres_database_element_from_template( postgres_database, server_name, @@ -1579,8 +1573,7 @@ def create_folder_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_folder_element_from_template( path_name, folder_name, file_system, description, version, is_own_anchor, initial_classifications ) @@ -1680,8 +1673,7 @@ def create_uc_server_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_uc_server_element_from_template( server_name, host_url, port, description, version, @@ -1774,8 +1766,7 @@ def create_uc_catalog_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_uc_catalog_element_from_template( uc_catalog, network_address, description, version, @@ -1870,8 +1861,7 @@ def create_uc_schema_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_uc_schema_element_from_template( uc_catalog, uc_schema, network_address, description, version ) @@ -2001,8 +1991,7 @@ def create_uc_table_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_uc_table_element_from_template( uc_catalog, uc_schema, @@ -2121,8 +2110,7 @@ def create_uc_function_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_uc_function_element_from_template( uc_catalog, uc_schema, @@ -2262,8 +2250,7 @@ def create_uc_volume_element_from_template( str The GUID of the File Folder element. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_uc_volume_element_from_template( uc_catalog, uc_schema, @@ -2400,8 +2387,7 @@ def save_client_side_secret( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_save_client_side_secret(secrets_store_guid, body)) + run_sync(self._async_save_client_side_secret(secrets_store_guid, body)) async def _async_delete_client_side_secret( self, @@ -2463,8 +2449,7 @@ def delete_client_side_secret( ----- See: https://egeria-project.org/concepts/client-side-secret """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_client_side_secret(secrets_store_guid, secret_name)) + run_sync(self._async_delete_client_side_secret(secrets_store_guid, secret_name)) # # Engine Actions @@ -2522,8 +2507,7 @@ def cancel_engine_action(self, engine_action_guid: str) -> None: ----- For more information see: https://egeria-project.org/concepts/engine-action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_cancel_engine_action(engine_action_guid)) + run_sync(self._async_cancel_engine_action(engine_action_guid)) return # The operations below moved to the Governance Engine view service in Egeria odpi/egeria#9371. These @@ -2559,8 +2543,7 @@ async def _async_claim_engine_action(self, engine_action_guid: str) -> None: def claim_engine_action(self, engine_action_guid: str) -> None: """Deprecated - use GovernanceEngine. Claim an engine action for the caller.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_claim_engine_action(engine_action_guid)) + run_sync(self._async_claim_engine_action(engine_action_guid)) async def _async_update_engine_action_status(self, engine_action_guid: str, status: str, body: Optional[dict] = None) -> None: @@ -2572,8 +2555,7 @@ async def _async_update_engine_action_status(self, engine_action_guid: str, stat def update_engine_action_status(self, engine_action_guid: str, status: str, body: Optional[dict] = None) -> None: """Deprecated - use GovernanceEngine. Update the status of an engine action.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_engine_action_status(engine_action_guid, status, body)) + run_sync(self._async_update_engine_action_status(engine_action_guid, status, body)) async def _async_update_action_target_status( self, action_target_guid: str, status: str, @@ -2589,8 +2571,7 @@ def update_action_target_status( start_date: Optional[str] = None, completion_date: Optional[str] = None, completion_message: Optional[str] = None, body: Optional[dict] = None) -> None: """Deprecated - use GovernanceEngine. Update the status of an action target.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_action_target_status( + run_sync(self._async_update_action_target_status( action_target_guid, status, start_date, completion_date, completion_message, body)) async def _async_record_completion_status( @@ -2610,8 +2591,7 @@ def record_completion_status( new_action_targets: Optional[list[dict]] = None, completion_message: Optional[str] = None, body: Optional[dict] = None) -> None: """Deprecated - use GovernanceEngine. Record the completion status of an engine action.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_record_completion_status( + run_sync(self._async_record_completion_status( engine_action_guid, status, request_parameters, output_guards, new_action_targets, completion_message, body)) @@ -2625,8 +2605,7 @@ async def _async_get_active_claimed_engine_actions( def get_active_claimed_engine_actions( self, governance_engine_guid: str, start_from: int = 0, page_size: int = 0) -> list | str: """Deprecated - use GovernanceEngine. Engine actions in process claimed by this caller.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_active_claimed_engine_actions( + return run_sync(self._async_get_active_claimed_engine_actions( governance_engine_guid, start_from, page_size)) @dynamic_catch @@ -2653,8 +2632,7 @@ async def _async_cancel_governance_action_process(self, process_instance_guid: s def cancel_governance_action_process(self, process_instance_guid: str) -> None: """Request that a running governance action process instance is cancelled.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_cancel_governance_action_process(process_instance_guid)) + run_sync(self._async_cancel_governance_action_process(process_instance_guid)) async def _async_get_active_engine_actions( self, @@ -2753,8 +2731,7 @@ def get_active_engine_actions( For more information see: https://egeria-project.org/concepts/engine-action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_active_engine_actions( start_from, page_size, @@ -2916,8 +2893,7 @@ def get_engine_actions_by_name( ----- For more information see: https://egeria-project.org/concepts/engine-action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_engine_actions_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -3101,8 +3077,7 @@ def find_engine_actions( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_engine_actions( search_string=search_string, starts_with=starts_with, @@ -3229,8 +3204,7 @@ def initiate_gov_action_process( str The GUID of the newly started governance engine process, or "Action not initiated". """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_gov_action_process( action_type_qualified_name=action_type_qualified_name, request_source_guids=request_source_guids, @@ -3345,8 +3319,7 @@ def initiate_gov_action_type( str The GUID of the newly started governance engine process, or "Action not initiated". """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_gov_action_type( action_type_qualified_name=action_type_qualified_name, request_source_guids=request_source_guids, @@ -3448,8 +3421,7 @@ def initiate_postgres_database_survey( self, postgres_database_guid: str, request_parameters: dict = None ) -> str: """Initiate a postgres database survey""" - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( "PostgreSQLSurvey::survey-postgres-database", postgres_database_guid, @@ -3462,8 +3434,7 @@ def initiate_postgres_server_survey( self, postgres_server_guid: str, request_parameters: dict = None ) -> str: """Initiate a postgres server survey""" - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( "PostgreSQLSurvey::survey-postgres-server", postgres_server_guid, @@ -3519,8 +3490,7 @@ def initiate_file_folder_survey( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( survey_name, file_folder_guid, @@ -3531,8 +3501,7 @@ def initiate_file_folder_survey( def initiate_file_survey(self, file_guid: str, request_parameters: dict = None) -> str: """Initiate a file survey""" - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( "FileSurvey::survey-data-file", file_guid, request_parameters ) @@ -3555,8 +3524,7 @@ def initiate_kafka_server_survey( The GUID of the initiated action or "Action not initiated" if the action was not initiated. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( "ApacheKafkaSurvey::survey-kafka-server", kafka_server_guid, @@ -3581,8 +3549,7 @@ def initiate_uc_server_survey( The GUID of the initiated action or "Action not initiated" if the action was not initiated. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( "UnityCatalogSurvey::survey-unity-catalog-server", uc_server_guid, @@ -3608,8 +3575,7 @@ def initiate_uc_schema_survey( The GUID of the initiated action or "Action not initiated" if the action was not initiated. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_survey( "UnityCatalogSurvey::survey-unity-catalog-schema", uc_schema_guid, @@ -3919,8 +3885,7 @@ def initiate_engine_action( str The GUID of the initiated action, or "Action not initiated". """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_initiate_engine_action( governance_engine_name=governance_engine_name, qualified_name=qualified_name, @@ -4037,8 +4002,7 @@ def get_catalog_targets( List of catalog targets. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_catalog_targets( integ_connector_guid=integ_connector_guid, start_from=start_from, @@ -4138,8 +4102,7 @@ def get_catalog_target( JSON structure of the catalog target. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_catalog_target( relationship_guid=relationship_guid, output_format=output_format, @@ -4280,8 +4243,7 @@ def add_catalog_target( The GUID of the relationship created. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_catalog_target( integ_connector_guid=integ_connector_guid, metadata_element_guid=metadata_element_guid, @@ -4397,8 +4359,7 @@ def update_catalog_target( None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_catalog_target( relationship_guid=relationship_guid, catalog_target_name=catalog_target_name, @@ -4453,8 +4414,7 @@ def remove_catalog_target(self, relationship_guid: str) -> None: ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_catalog_target(relationship_guid)) + run_sync(self._async_remove_catalog_target(relationship_guid)) # # Get information about technologies @@ -4555,8 +4515,7 @@ def get_tech_types_for_open_metadata_type( list | str List of technology types. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_tech_types_for_open_metadata_type( type_name=type_name, tech_name=tech_name, @@ -4661,8 +4620,7 @@ def get_tech_type_detail( Detailed information for the specified technology type, or "no type found". """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_tech_type_detail( filter_string=filter_string, body=body, @@ -4769,8 +4727,7 @@ def get_tech_type_hierarchy( The hierarchy of technology types, or "no type found". """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_tech_type_hierarchy( filter_string=filter_string, body=body, @@ -4832,8 +4789,7 @@ def get_template_guid_for_technology_type(self, type_name: str, **kwargs) -> str str The GUID of the template, or None if not found. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_template_guid_for_technology_type(type_name, **kwargs) ) return response @@ -5003,8 +4959,7 @@ def find_technology_types( list | str List of technology types in the requested format. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_technology_types( search_string=search_string, starts_with=starts_with, @@ -5183,8 +5138,7 @@ def find_technology_types_body( ----- For more information see: https://egeria-project.org/concepts/deployed-implementation-type """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_technology_types_body( search_string=search_string, starts_with=starts_with, @@ -5469,8 +5423,7 @@ def get_technology_type_elements( ----- For more information see: https://egeria-project.org/concepts/deployed-implementation-type """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_technology_type_elements( filter_string=filter_string, effective_time=effective_time, diff --git a/pyegeria/omvs/classification_explorer.py b/pyegeria/omvs/classification_explorer.py index 533a51c1..b60fbe9b 100644 --- a/pyegeria/omvs/classification_explorer.py +++ b/pyegeria/omvs/classification_explorer.py @@ -28,6 +28,7 @@ get_required_relationships, ) from pyegeria.core.utils import body_slimmer, dynamic_catch +from pyegeria.core.async_runner import run_sync @@ -234,8 +235,7 @@ def get_classified_elements_by( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_classified_elements_by( classification_name, body, output_format, report_spec, **kwargs ) @@ -367,8 +367,7 @@ def get_security_tagged_elements( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_security_tagged_elements( body, output_format, report_spec, **kwargs ) @@ -493,8 +492,7 @@ def get_owners_elements( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_owners_elements(owner_name, body, output_format, report_spec, **kwargs) ) return response @@ -613,8 +611,7 @@ def get_root_elements_by_category( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_root_elements_by_category(category, body, output_format, report_spec, **kwargs) ) return response @@ -740,8 +737,7 @@ def get_subject_area_members( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_subject_area_members( subject_area, body, output_format, report_spec, **kwargs ) @@ -874,8 +870,7 @@ def get_elements_by_origin( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_by_origin(body, output_format, report_spec, **kwargs) ) return response @@ -1015,8 +1010,7 @@ def get_meanings( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_meanings(element_guid, body, output_format, report_spec, **kwargs ) ) @@ -1157,8 +1151,7 @@ def get_semantic_assignees( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_semantic_assignees(term_guid, body, output_format, report_spec, **kwargs ) ) @@ -1286,8 +1279,7 @@ def get_governed_elements( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_governed_elements(gov_def_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -1415,8 +1407,7 @@ def get_governed_by_definitions( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_governed_by_definitions(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -1550,8 +1541,7 @@ def get_source_elements( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_source_elements(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -1683,8 +1673,7 @@ def get_elements_sourced_from( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_sourced_from(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -1812,8 +1801,7 @@ def get_scopes( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_scopes(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -1946,8 +1934,7 @@ def get_scoped_elements( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_scoped_elements(scope_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) return response @@ -2073,8 +2060,7 @@ def get_licensed_elements( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_licensed_elements(license_type_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -2202,8 +2188,7 @@ def get_licenses( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_licenses(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -2331,8 +2316,7 @@ def get_certified_elements( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_certified_elements(certification_type_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -2461,8 +2445,7 @@ def get_certifications( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_certifications(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -2567,8 +2550,7 @@ def get_elements( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements( metadata_element_type, start_from, @@ -2810,8 +2792,7 @@ def get_elements_by_property_value( PyegeriaException. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_by_property_value( property_value, property_names, @@ -3089,8 +3070,7 @@ def find_elements_by_property_value( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_elements_by_property_value( property_value, property_names, @@ -3215,8 +3195,7 @@ def get_element_by_guid( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_element_by_guid( guid=guid, element_type_name=element_type_name, @@ -3335,8 +3314,7 @@ def get_element_by_unique_name( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_element_by_unique_name(name, property_name, output_format, report_spec, body, **kwargs) ) return response @@ -3414,8 +3392,7 @@ def get_element_guid_by_unique_name( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_element_guid_by_unique_name( name, property_name, @@ -3488,8 +3465,7 @@ def get_guid_for_name( PyegeriaExeception """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_guid_for_name(name, property_name, type_name, **kwargs) ) return response @@ -3599,8 +3575,7 @@ def get_elements_by_classification( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_by_classification( classification_name, start_from, @@ -3849,8 +3824,7 @@ def get_elements_by_classification_with_property_value( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_elements_by_classification_with_property_value( classification_name, property_value, @@ -4081,8 +4055,7 @@ def find_elements_by_classification_with_property_value( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_elements_by_classification_with_property_value( classification_name, property_value, @@ -4238,8 +4211,7 @@ def get_related_elements( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_related_elements( element_guid, relationship_type, @@ -4470,8 +4442,7 @@ def get_related_elements_with_property_value( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_related_elements_with_property_value( element_guid, relationship_type, @@ -4719,8 +4690,7 @@ def find_related_elements_with_property_value( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_related_elements_with_property_value( element_guid, relationship_type, @@ -4868,8 +4838,7 @@ def get_relationships( report_spec (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_relationships( relationship_type, start_from, @@ -5030,8 +4999,7 @@ def get_relationships_with_property_value( report_spec (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_relationships_with_property_value( property_value, property_names, @@ -5287,8 +5255,7 @@ def find_relationships_with_property_value( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_relationships_with_property_value( property_value, property_names, @@ -5431,8 +5398,7 @@ def retrieve_instance_for_guid( report_spec (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_retrieve_instance_for_guid(guid, effective_time, for_lineage, for_duplicate_processing, timeout, output_format, report_spec, **kwargs) ) @@ -5563,8 +5529,7 @@ def set_confidence_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_confidence_classification( element_guid, body, @@ -5696,8 +5661,7 @@ def clear_confidence_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_confidence_classification( element_guid, body, @@ -5832,8 +5796,7 @@ def set_confidentiality_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_confidentiality_classification( element_guid, body, @@ -5962,8 +5925,7 @@ def clear_confidentiality_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_confidentiality_classification( element_guid, body, @@ -6095,8 +6057,7 @@ def set_impact_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_impact_classification( element_guid, body, @@ -6225,8 +6186,7 @@ def clear_impact_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_impact_classification( element_guid, body, @@ -6357,8 +6317,7 @@ def set_criticality_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_criticality_classification( element_guid, body, @@ -6487,8 +6446,7 @@ def clear_criticality_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_criticality_classification( element_guid, body, @@ -6602,8 +6560,7 @@ def add_gov_definition_to_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_gov_definition_to_element( definition_guid, element_guid, @@ -6700,8 +6657,7 @@ def remove_gov_definition_from_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_gov_definition_from_element( definition_guid, element_guid, @@ -6766,8 +6722,7 @@ def add_scope_to_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_scope_to_element( scoped_by_guid, element_guid, @@ -6841,8 +6796,7 @@ def clear_scope_from_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_scope_from_element(scoped_by_guid, element_guid, body) ) @@ -6907,8 +6861,7 @@ def add_resource_to_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_resource_to_element( resource_guid, element_guid, @@ -6980,8 +6933,7 @@ def remove_resource_from_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_resource_from_element(resource_guid, element_guid, body) ) @@ -7109,8 +7061,7 @@ def get_resource_list( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_resource_list(element_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -7242,8 +7193,7 @@ def get_supported_by_resource( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_supported_by_resource(resource_guid, start_from, page_size, output_format, report_spec, body, **kwargs) ) @@ -7309,8 +7259,7 @@ def add_more_information( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_more_information( more_info_guid, element_guid, @@ -7382,8 +7331,7 @@ def remove_more_information( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_more_information(more_info_guid, element_guid, body) ) @@ -7481,8 +7429,7 @@ def assign_actor_to_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_assign_actor_to_element( element_guid, actor_guid, @@ -7588,8 +7535,7 @@ def unassign_actor_from_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unassign_actor_from_element( element_guid, actor_guid, @@ -7723,8 +7669,7 @@ def add_certification_to_element( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_certification_to_element(certification_type_guid, element_guid, body) ) return response @@ -7841,8 +7786,7 @@ def update_certification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_certification(certification_guid, body) ) @@ -7899,8 +7843,7 @@ def decertify_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_decertify_element(certification_guid, body) ) @@ -8031,8 +7974,7 @@ def add_license_to_element( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_add_license_to_element(license_type_guid, element_guid, body) ) return response @@ -8157,8 +8099,7 @@ def update_license( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_license(license_guid, body) ) @@ -8220,8 +8161,7 @@ def unlicense_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlicense_element(license_guid, body) ) @@ -8334,8 +8274,7 @@ def add_ownership_to_element( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_ownership_to_element( element_guid, body, @@ -8431,8 +8370,7 @@ def clear_ownership_from_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_ownership_from_element(element_guid, for_lineage, for_duplicate_processing, effective_time, timeout) ) @@ -8544,8 +8482,7 @@ def add_digital_resource_origin( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_digital_resource_origin( element_guid, body, @@ -8617,8 +8554,7 @@ def clear_digital_resource_origin_from_element( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_digital_resource_origin_from_element(element_guid, body) ) @@ -8723,8 +8659,7 @@ def add_zone_membership( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_zone_membership( element_guid, body, @@ -8795,8 +8730,7 @@ def clear_zone_membership( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_zone_membership(element_guid, body) ) @@ -8940,8 +8874,7 @@ def set_retention_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_retention_classification( element_guid, body, @@ -9070,8 +9003,7 @@ def clear_retention_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_retention_classification( element_guid, body, @@ -9206,8 +9138,7 @@ def set_governance_expectation( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_governance_expectation( element_guid, body, @@ -9331,8 +9262,7 @@ def clear_governance_expectation( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_governance_expectation( element_guid, body, @@ -9469,8 +9399,7 @@ def update_governance_expectation( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_governance_expectation( element_guid, body, @@ -9606,8 +9535,7 @@ def add_governance_measurements( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_governance_measurements( element_guid, body, @@ -9745,8 +9673,7 @@ def update_governance_measurements( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_governance_measurements( element_guid, body, @@ -9868,8 +9795,7 @@ def clear_governance_measurements( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_governance_measurements( element_guid, body, @@ -10006,8 +9932,7 @@ def add_data_scope( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_data_scope( element_guid, body, @@ -10153,8 +10078,7 @@ def update_data_scope( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_data_scope( element_guid, body, @@ -10276,8 +10200,7 @@ def clear_data_scope( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_data_scope( element_guid, body, @@ -10406,8 +10329,7 @@ def set_security_tags_classification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_security_tags_classification( element_guid, body, @@ -10532,8 +10454,7 @@ def clear_security_tags_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_security_tags_classification( element_guid, body, @@ -10658,8 +10579,7 @@ def set_accounting_codes_classification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_accounting_codes_classification( element_guid, body, @@ -10783,8 +10703,7 @@ def clear_accounting_codes_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_accounting_codes_classification( element_guid, body, @@ -10891,8 +10810,7 @@ def add_search_keyword_to_element( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_add_search_keyword_to_element( element_guid, body, @@ -10996,8 +10914,7 @@ def update_search_keyword( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_search_keyword( search_keyword_guid, body, @@ -11068,8 +10985,7 @@ def remove_search_keyword_from_element( PyegeriaException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_search_keyword_from_element( search_keyword_guid, timeout, @@ -11177,8 +11093,7 @@ def set_known_duplicate_classification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_known_duplicate_classification( element_guid, body, @@ -11296,8 +11211,7 @@ def clear_known_duplicate_classification( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_known_duplicate_classification( element_guid, body, @@ -11429,8 +11343,7 @@ def link_elements_as_peer_duplicates( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_elements_as_peer_duplicates( element_guid, peer_duplicate_guid, @@ -11538,8 +11451,7 @@ def unlink_elements_as_peer_duplicates( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_elements_as_peer_duplicates( element_guid, peer_duplicate_guid, @@ -11661,8 +11573,7 @@ def set_consolidated_duplicate_classification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_consolidated_duplicate_classification( element_guid, body, @@ -11778,8 +11689,7 @@ def clear_consolidated_duplicate_classification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_consolidated_duplicate_classification( element_guid, body, @@ -11900,8 +11810,7 @@ def link_consolidated_duplicate_to_source( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_consolidated_duplicate_to_source( element_guid, source_element_guid, @@ -12009,8 +11918,7 @@ def unlink_consolidated_duplicate_from_source_element( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_consolidated_duplicate_from_source_element( element_guid, source_element_guid, @@ -12146,8 +12054,7 @@ def setup_semantic_assignment( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_setup_semantic_assignment( glossary_term_guid, element_guid, @@ -12279,8 +12186,7 @@ def clear_semantic_assignment_classification( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_semantic_assignment_classification( glossary_term_guid, element_guid, @@ -12424,8 +12330,7 @@ def add_element_to_subject_area( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_element_to_subject_area( element_guid, body, @@ -12527,8 +12432,7 @@ def remove_element_from_subject_area( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_element_from_subject_area( element_guid, for_lineage, @@ -12690,8 +12594,7 @@ def find_root_elements( # graph_query_depth, report_spec in output_format, timeout in report_spec, body in # timeout, and body itself dropped) — the same bug shape as ISSUE-21 # (get_scoped_elements/get_scopes). - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_root_elements( metadata_element_type_name=metadata_element_type_name, search_properties=search_properties, @@ -12875,8 +12778,7 @@ def find_authored_elements( list | str - a list of authored elements or a string message if no elements are found """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_authored_elements( search_string=search_string, content_status_list=content_status_list, @@ -13015,8 +12917,7 @@ def find_authored_elements_by_category( list | str - a list of authored elements or a string message if no elements are found """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_authored_elements_by_category( search_string, content_status_list, @@ -13144,8 +13045,7 @@ def add_supplementary_properties_to_element( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_add_supplementary_properties_to_element( element_guid, glossary_term_guid, @@ -13273,8 +13173,7 @@ def remove_supplementary_properties_from_element( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_supplementary_properties_from_element( element_guid, glossary_term_guid, @@ -13308,8 +13207,7 @@ async def _async_set_element_as_incomplete(self, element_guid: str, def set_element_as_incomplete(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as incomplete (still being assembled).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_incomplete(element_guid, body)) + run_sync(self._async_set_element_as_incomplete(element_guid, body)) @dynamic_catch async def _async_clear_element_as_incomplete(self, element_guid: str, @@ -13323,8 +13221,7 @@ async def _async_clear_element_as_incomplete(self, element_guid: str, def clear_element_as_incomplete(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the Incomplete classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_incomplete(element_guid, body)) + run_sync(self._async_clear_element_as_incomplete(element_guid, body)) @dynamic_catch async def _async_set_element_as_object_identifier(self, element_guid: str, @@ -13340,8 +13237,7 @@ async def _async_set_element_as_object_identifier(self, element_guid: str, def set_element_as_object_identifier(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as an object identifier.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_object_identifier(element_guid, body)) + run_sync(self._async_set_element_as_object_identifier(element_guid, body)) @dynamic_catch async def _async_clear_element_as_object_identifier(self, element_guid: str, @@ -13355,8 +13251,7 @@ async def _async_clear_element_as_object_identifier(self, element_guid: str, def clear_element_as_object_identifier(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the ObjectIdentifier classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_object_identifier(element_guid, body)) + run_sync(self._async_clear_element_as_object_identifier(element_guid, body)) @dynamic_catch async def _async_set_element_as_reference_data(self, element_guid: str, @@ -13372,8 +13267,7 @@ async def _async_set_element_as_reference_data(self, element_guid: str, def set_element_as_reference_data(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as reference data.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_reference_data(element_guid, body)) + run_sync(self._async_set_element_as_reference_data(element_guid, body)) @dynamic_catch async def _async_clear_element_as_reference_data(self, element_guid: str, @@ -13387,8 +13281,7 @@ async def _async_clear_element_as_reference_data(self, element_guid: str, def clear_element_as_reference_data(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the ReferenceData classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_reference_data(element_guid, body)) + run_sync(self._async_clear_element_as_reference_data(element_guid, body)) @dynamic_catch async def _async_set_element_as_mobile_resource(self, element_guid: str, @@ -13404,8 +13297,7 @@ async def _async_set_element_as_mobile_resource(self, element_guid: str, def set_element_as_mobile_resource(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a mobile resource.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_mobile_resource(element_guid, body)) + run_sync(self._async_set_element_as_mobile_resource(element_guid, body)) @dynamic_catch async def _async_clear_element_as_mobile_resource(self, element_guid: str, @@ -13419,8 +13311,7 @@ async def _async_clear_element_as_mobile_resource(self, element_guid: str, def clear_element_as_mobile_resource(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the MobileResource classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_mobile_resource(element_guid, body)) + run_sync(self._async_clear_element_as_mobile_resource(element_guid, body)) @dynamic_catch async def _async_set_element_as_instance_metadata(self, element_guid: str, @@ -13434,8 +13325,7 @@ async def _async_set_element_as_instance_metadata(self, element_guid: str, def set_element_as_instance_metadata(self, element_guid: str, body: dict | NewClassificationRequestBody) -> None: """Classify an element as instance metadata.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_instance_metadata(element_guid, body)) + run_sync(self._async_set_element_as_instance_metadata(element_guid, body)) @dynamic_catch async def _async_clear_element_as_instance_metadata(self, element_guid: str, @@ -13449,8 +13339,7 @@ async def _async_clear_element_as_instance_metadata(self, element_guid: str, def clear_element_as_instance_metadata(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the InstanceMetadata classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_instance_metadata(element_guid, body)) + run_sync(self._async_clear_element_as_instance_metadata(element_guid, body)) @dynamic_catch async def _async_set_element_as_metamodel_instance(self, element_guid: str, @@ -13478,8 +13367,7 @@ def set_element_as_metamodel_instance(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None, metamodel_element_guid: Optional[str] = None) -> None: """Classify an element as an instance in a metamodel, referencing the metamodel element it instantiates.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_metamodel_instance(element_guid, body, metamodel_element_guid)) + run_sync(self._async_set_element_as_metamodel_instance(element_guid, body, metamodel_element_guid)) @dynamic_catch async def _async_clear_element_as_metamodel_instance(self, element_guid: str, @@ -13493,8 +13381,7 @@ async def _async_clear_element_as_metamodel_instance(self, element_guid: str, def clear_element_as_metamodel_instance(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the MetamodelInstance classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_metamodel_instance(element_guid, body)) + run_sync(self._async_clear_element_as_metamodel_instance(element_guid, body)) @dynamic_catch async def _async_set_element_as_promise(self, element_guid: str, @@ -13540,8 +13427,7 @@ def set_element_as_promise(self, element_guid: str, """Classify an element as a Promise - a placeholder for a real-world digital resource/artifact that has not yet been delivered. Once classified, the element is only returned to lineage requests (forLineage=true). See _async_set_element_as_promise for a sample body.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_element_as_promise(element_guid, body)) + run_sync(self._async_set_element_as_promise(element_guid, body)) @dynamic_catch async def _async_clear_element_as_promise(self, element_guid: str, @@ -13560,8 +13446,7 @@ def clear_element_as_promise(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the Promise classification from an element - typically because the promised resource has now been delivered. The default body sets forLineage=true, which Egeria requires for this request.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_element_as_promise(element_guid, body)) + run_sync(self._async_clear_element_as_promise(element_guid, body)) # # UsageActivity @@ -13602,8 +13487,7 @@ def add_usage_activity(self, element_guid: str, body: Optional[dict | NewClassif It records how often the element has been read, found, updated and had attachments or feedback changed or deleted. See _async_add_usage_activity for the body.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_usage_activity(element_guid, body)) + run_sync(self._async_add_usage_activity(element_guid, body)) @dynamic_catch async def _async_update_usage_activity(self, element_guid: str, @@ -13636,8 +13520,7 @@ async def _async_update_usage_activity(self, element_guid: str, def update_usage_activity(self, element_guid: str, body: dict | UpdateClassificationRequestBody) -> None: """Update the properties of an element's UsageActivity classification. See _async_update_usage_activity for the body.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_usage_activity(element_guid, body)) + run_sync(self._async_update_usage_activity(element_guid, body)) @dynamic_catch async def _async_clear_usage_activity(self, element_guid: str, @@ -13652,8 +13535,7 @@ async def _async_clear_usage_activity(self, element_guid: str, @dynamic_catch def clear_usage_activity(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the UsageActivity classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_usage_activity(element_guid, body)) + run_sync(self._async_clear_usage_activity(element_guid, body)) # # MemberPopularityProfile @@ -13701,8 +13583,7 @@ def add_member_popularity_profile(self, element_guid: str, body: Optional[dict | It holds the same activity counts as UsageActivity for a collection, as a total plus a per-member map of member GUID to count. See _async_add_member_popularity_profile for the body.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_member_popularity_profile(element_guid, body)) + run_sync(self._async_add_member_popularity_profile(element_guid, body)) @dynamic_catch async def _async_update_member_popularity_profile(self, element_guid: str, @@ -13742,8 +13623,7 @@ async def _async_update_member_popularity_profile(self, element_guid: str, def update_member_popularity_profile(self, element_guid: str, body: dict | UpdateClassificationRequestBody) -> None: """Update the properties of an element's MemberPopularityProfile classification. See _async_update_member_popularity_profile for the body.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_member_popularity_profile(element_guid, body)) + run_sync(self._async_update_member_popularity_profile(element_guid, body)) @dynamic_catch async def _async_clear_member_popularity_profile(self, element_guid: str, @@ -13758,8 +13638,7 @@ async def _async_clear_member_popularity_profile(self, element_guid: str, @dynamic_catch def clear_member_popularity_profile(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the MemberPopularityProfile classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_member_popularity_profile(element_guid, body)) + run_sync(self._async_clear_member_popularity_profile(element_guid, body)) if __name__ == "__main__": diff --git a/pyegeria/omvs/collection_manager.py b/pyegeria/omvs/collection_manager.py index 9a179908..88b6c65f 100644 --- a/pyegeria/omvs/collection_manager.py +++ b/pyegeria/omvs/collection_manager.py @@ -27,6 +27,7 @@ from pyegeria.view.output_formatter import (generate_output, populate_common_columns) from pyegeria.core.utils import body_slimmer, dynamic_catch +from pyegeria.core.async_runner import run_sync COLLECTION_PROPERTIES_LIST = ["CollectionProperties", "DataDictionaryProperties", "DataSpecProperties", "DigitalProductProperties", @@ -359,7 +360,7 @@ def get_attached_collections(self, parent_guid: str, start_from: int = 0, page_s } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_attached_collections(parent_guid, start_from, page_size, body, output_format, report_spec)) @@ -535,8 +536,7 @@ def find_collections( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_collections( search_string=search_string, starts_with=starts_with, @@ -687,8 +687,7 @@ def find_digital_products( """ Returns the list of digital products matching the search string and optional deployment status. Sync version. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_digital_products( search_string=search_string, starts_with=starts_with, @@ -804,7 +803,7 @@ def get_digital_products_by_category( See _async_get_digital_products_by_category for more details. """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_digital_products_by_category( category, deployment_status_list, @@ -881,8 +880,7 @@ def get_collections_by_name( **kwargs, ) -> list | str: """Returns the list of collections matching the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_collections_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -931,7 +929,7 @@ def get_collections_by_name( PyegeriaException """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_collections_by_name(filter_string, classification_names, body, start_from, page_size, output_format, report_spec)) @@ -1061,7 +1059,7 @@ def get_collections_by_category(self, category: str, classification_names: Optio """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_collections_by_category(category, classification_names, body, start_from, page_size, output_format, report_spec)) @@ -1115,8 +1113,7 @@ def get_collection_by_guid( **kwargs, ) -> dict | str: """Return the properties of a specific collection.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_collection_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -1266,8 +1263,7 @@ def get_collection_members(self, collection_guid: Optional[str] = None, collecti } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_collection_members(collection_guid, collection_name, collection_qname, body, start_from, page_size, output_format, report_spec, **kwargs)) @@ -1390,7 +1386,7 @@ def get_collection_hierarchy(self, collection_guid: Optional[str] = None, body: "sequencingProperty": "" } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_collection_hierarchy(collection_guid, body, start_from, page_size, output_format, report_spec)) @@ -1651,7 +1647,7 @@ def create_collection(self, display_name: Optional[str] = None, description: Opt """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name, description,category, initial_classifications, prop, body)) @@ -1691,7 +1687,7 @@ def create_root_collection(self, display_name: Optional[str] = None, description """ prop = "RootCollection" - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name=display_name, description=description, category=category, initial_classifications = [], prop = [prop], body=body)) @@ -1730,7 +1726,7 @@ def create_folder_collection(self, display_name: Optional[str] = None, descripti """ prop = "CollectionFolder" - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name=display_name, description=description, category=category, initial_classifications=[], prop=[prop], body=body)) @dynamic_catch @@ -1767,7 +1763,7 @@ def create_folio(self, display_name: Optional[str] = None, description: Optional """ prop = "Folio" - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name=display_name, description=description, category=category, initial_classifications=[], prop=[prop], body=body)) @@ -1806,7 +1802,7 @@ def create_subject_area(self, display_name: Optional[str] = None, description: O """ prop = "SubjectArea" - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name=display_name, description=description, category=category, initial_classifications=[], prop=[prop], body=body)) @@ -1844,7 +1840,7 @@ def create_reference_list_collection(self, display_name: Optional[str] = None, d """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name, description, category, ["ReferenceList"], body)) @@ -1882,7 +1878,7 @@ def create_context_event_collection(self, display_name: Optional[str] = None, de """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_collection(display_name, description, category, ["ContextEvent"], body)) @@ -2161,7 +2157,7 @@ def create_data_spec_collection(self, display_name: Optional[str] = None, descri """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_data_spec_collection(display_name, description,category, classification_name, body)) @@ -2368,7 +2364,7 @@ def create_report_type_collection(self, display_name: Optional[str] = None, desc """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_report_type_collection(display_name, description,category, classification_name, body)) @@ -2445,7 +2441,7 @@ def create_question_spec_folder(self, display_name: Optional[str] = None, ------- str - guid of the created CollectionFolder """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_question_spec_folder(display_name, description, category, body)) @dynamic_catch @@ -2609,7 +2605,7 @@ def create_security_list(self, display_name: Optional[str] = None, description: } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_security_list(display_name, description,category, classification_name, prop, distinguished_name, body)) @@ -2669,7 +2665,7 @@ def create_security_group(self, display_name: Optional[str] = None, description: The principle specified by the user_id does not have authorization for the requested action """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_security_list(display_name, description, category, classification_name, "SecurityGroup", distinguished_name, body)) @@ -2727,7 +2723,7 @@ def create_security_Role(self, display_name: Optional[str] = None, description: The principle specified by the user_id does not have authorization for the requested action """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_security_list(display_name, description, category, classification_name, "SecurityRole", distinguished_name, body)) @@ -2982,7 +2978,7 @@ def create_data_dictionary_collection(self, display_name: Optional[str] = None, """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_data_dictionary_collection(display_name, description,category, classification_name, body)) @@ -3138,7 +3134,7 @@ def create_skill_set_collection(self, display_name: Optional[str] = None, """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_skill_set_collection(display_name, description, category, classification_name, body)) @@ -3291,7 +3287,7 @@ def create_reference_list_collection(self, display_name: Optional[str] = None, """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_reference_list_collection(display_name, description, category, classification_name, body)) @@ -3384,7 +3380,7 @@ def link_associated_skill_set(self, actor_guid: str, skill_set_guid: str, } } """ - asyncio.get_event_loop().run_until_complete( + run_sync( self._async_link_associated_skill_set(actor_guid, skill_set_guid, body)) @dynamic_catch @@ -3466,7 +3462,7 @@ def detach_associated_skill_set(self, actor_guid: str, skill_set_guid: str, "forDuplicateProcessing" : false } """ - asyncio.get_event_loop().run_until_complete( + run_sync( self._async_detach_associated_skill_set(actor_guid, skill_set_guid, body)) @@ -3599,8 +3595,7 @@ def create_collection_from_template(self, body: Optional[dict | TemplateRequestB } } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_collection_from_template(body)) + resp = run_sync(self._async_create_collection_from_template(body)) return resp # @@ -3720,7 +3715,7 @@ def update_collection(self, collection_guid: str, body: dict | NewElementReques } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_collection(collection_guid, body)) @@ -3818,8 +3813,7 @@ def set_editing_collection(self, collection_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_editing_collection(collection_guid, body)) @dynamic_catch @@ -3904,8 +3898,7 @@ def clear_editing_collection(self, collection_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_editing_collection(collection_guid, body)) @dynamic_catch @@ -4000,8 +3993,7 @@ def set_scoping_collection(self, collection_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_scoping_collection(collection_guid, body)) @dynamic_catch @@ -4086,8 +4078,7 @@ def clear_scoping_collection(self, collection_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_scoping_collection(collection_guid, body)) @dynamic_catch @@ -4182,8 +4173,7 @@ def set_staging_collection(self, collection_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_staging_collection(collection_guid, body)) @dynamic_catch @@ -4268,8 +4258,7 @@ def clear_staging_collection(self, collection_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_staging_collection(collection_guid, body)) @@ -4410,7 +4399,7 @@ def create_digital_product(self, body: Optional[dict | NewElementRequestBody] = default to ACTIVE. """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_digital_product(body)) @@ -4508,7 +4497,7 @@ def create_digital_product_catalog(self, body: Optional[dict | NewElementRequest DEPRECATED, OBSOLETE or OTHER (with OTHER, also set `userDefinedContentStatus`). """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_digital_product_catalog(body)) @@ -4643,7 +4632,7 @@ def update_digital_product(self, collection_guid: str, body: dict | UpdateEleme } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_digital_product(collection_guid, body)) @@ -4771,7 +4760,7 @@ def create_agreement(self, body: Optional[dict | NewElementRequestBody] = None) DEPRECATED, OBSOLETE or OTHER (with OTHER, also set `userDefinedContentStatus`). """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_agreement(body)) # @@ -5015,7 +5004,7 @@ def update_agreement(self, agreement_guid: str, body: dict | UpdateElementReque } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_agreement(agreement_guid, body)) @@ -5131,8 +5120,7 @@ def link_agreement_actor(self, agreement_guid: str, actor_guid: str, body: Optio } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_agreement_actor(agreement_guid, actor_guid, body)) @@ -5224,8 +5212,7 @@ def detach_agreement_actor(self, agreement_actor_relationship_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_agreement_actor(agreement_actor_relationship_guid, body)) @@ -5368,8 +5355,7 @@ def link_agreement_item(self, agreement_guid: str, agreement_item_guid: str, bod } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_agreement_item(agreement_guid, agreement_item_guid, body)) + return run_sync(self._async_link_agreement_item(agreement_guid, agreement_item_guid, body)) @dynamic_catch @@ -5456,8 +5442,7 @@ def detach_agreement_item(self, agreement_guid: str, agreement_item_guid: str, b } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_agreement_item(agreement_guid, agreement_item_guid, body)) + run_sync(self._async_detach_agreement_item(agreement_guid, agreement_item_guid, body)) @dynamic_catch @@ -5566,8 +5551,7 @@ def link_contract(self, agreement_guid: str, external_ref_guid: str, body: dict } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_contract(agreement_guid, external_ref_guid, body)) + run_sync(self._async_link_contract(agreement_guid, external_ref_guid, body)) @dynamic_catch @@ -5653,8 +5637,7 @@ def detach_contract(self, agreement_guid: str, external_ref_guid: str, body: dic } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_contract(agreement_guid, external_ref_guid, body)) + run_sync(self._async_detach_contract(agreement_guid, external_ref_guid, body)) # # Digital Subscriptions @@ -5831,8 +5814,7 @@ def create_digital_subscription(self, body: dict) -> str: "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_digital_subscription(body)) + resp = run_sync(self._async_create_digital_subscription(body)) return resp @@ -5945,8 +5927,7 @@ def update_digital_subscription(self, digital_subscription_guid: str, body: dict } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_digital_subscription(digital_subscription_guid, body)) @@ -6053,8 +6034,7 @@ def link_subscriber(self, subscriber_guid: str, subscription_guid: str, } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_subscriber(subscriber_guid, subscription_guid, body)) + run_sync(self._async_link_subscriber(subscriber_guid, subscription_guid, body)) @dynamic_catch @@ -6141,8 +6121,7 @@ def detach_subscriber(self, subscriber_guid: str, subscription_guid: str, body: "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_subscriber(subscriber_guid, subscription_guid, body)) + run_sync(self._async_detach_subscriber(subscriber_guid, subscription_guid, body)) # # @@ -6234,8 +6213,7 @@ async def _async_attach_data_description(self, element_guid: str, collection_gui def attach_data_description(self, element_guid: str, collection_guid: str, body: dict | NewRelationshipRequestBody = None): """Attach a data description collection to an element (DataDescription relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_attach_data_description(element_guid, collection_guid, body)) + run_sync(self._async_attach_data_description(element_guid, collection_guid, body)) @dynamic_catch async def _async_detach_data_description(self, element_guid: str, collection_guid: str, @@ -6262,8 +6240,7 @@ async def _async_detach_data_description(self, element_guid: str, collection_gui def detach_data_description(self, element_guid: str, collection_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): """Detach a data description collection from an element (DataDescription relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_data_description(element_guid, collection_guid, body)) + run_sync(self._async_detach_data_description(element_guid, collection_guid, body)) @dynamic_catch async def _async_attach_smart_query(self, results_set_guid: str, saved_query_guid: str, @@ -6319,8 +6296,7 @@ async def _async_attach_smart_query(self, results_set_guid: str, saved_query_gui def attach_smart_query(self, results_set_guid: str, saved_query_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Connect a SavedQuery to a ResultsSet via the collection-manager-native SmartQuery attach endpoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_attach_smart_query(results_set_guid, saved_query_guid, body)) + run_sync(self._async_attach_smart_query(results_set_guid, saved_query_guid, body)) @dynamic_catch async def _async_detach_smart_query(self, results_set_guid: str, saved_query_guid: str, @@ -6357,8 +6333,7 @@ async def _async_detach_smart_query(self, results_set_guid: str, saved_query_gui def detach_smart_query(self, results_set_guid: str, saved_query_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Disconnect a SavedQuery from a ResultsSet via the collection-manager-native SmartQuery detach endpoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_smart_query(results_set_guid, saved_query_guid, body)) + run_sync(self._async_detach_smart_query(results_set_guid, saved_query_guid, body)) @dynamic_catch def attach_collection(self, parent_guid: str, collection_guid: str, @@ -6412,8 +6387,7 @@ def attach_collection(self, parent_guid: str, collection_guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_attach_collection(parent_guid, collection_guid, body)) + run_sync(self._async_attach_collection(parent_guid, collection_guid, body)) @dynamic_catch @@ -6506,8 +6480,7 @@ def detach_collection(self, parent_guid: str, collection_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_collection(parent_guid, collection_guid, body)) + run_sync(self._async_detach_collection(parent_guid, collection_guid, body)) @dynamic_catch @@ -6599,8 +6572,7 @@ def delete_collection(self, collection_guid: str, body: Optional[dict | DeleteEl """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_collection(collection_guid, body, cascade)) + run_sync(self._async_delete_collection(collection_guid, body, cascade)) @dynamic_catch async def _async_archive_collection(self, collection_guid: str, @@ -6636,8 +6608,7 @@ def archive_collection(self, collection_guid: str, body: dict | DeleteElementRequestBody, optional May set archiveDate, archiveProcess and archiveProperties; deleteMethod is always ARCHIVE. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_archive_collection(collection_guid, body)) + run_sync(self._async_archive_collection(collection_guid, body)) @dynamic_catch @@ -6759,14 +6730,12 @@ def add_to_collection(self, collection_guid: str, element_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_to_collection( collection_guid, element_guid, body)) + run_sync(self._async_add_to_collection( collection_guid, element_guid, body)) def add_term_to_folder(self, folder_guid: str, term_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Add a term to a category. The request body is optional.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_to_collection(folder_guid, term_guid, body)) + run_sync(self._async_add_to_collection(folder_guid, term_guid, body)) @dynamic_catch @@ -6888,8 +6857,7 @@ def update_collection_membership_prop(self, collection_guid: str, element_guid: "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_collection_membership(collection_guid, element_guid, body)) @@ -7026,8 +6994,7 @@ def link_saved_query_to_results_set(self, results_set_guid: str, saved_query_gui str The unique identifier (GUID) of the newly created SmartQuery relationship. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_saved_query_to_results_set(results_set_guid, saved_query_guid, body)) @dynamic_catch @@ -7086,8 +7053,7 @@ def detach_saved_query_from_results_set(self, relationship_guid: str, ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_saved_query_from_results_set(relationship_guid, body)) + run_sync(self._async_detach_saved_query_from_results_set(relationship_guid, body)) def remove_from_collection(self, collection_guid: str, element_guid: str, @@ -7129,8 +7095,7 @@ def remove_from_collection(self, collection_guid: str, element_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_from_collection(collection_guid, element_guid, body)) + run_sync(self._async_remove_from_collection(collection_guid, element_guid, body)) # # @@ -7168,8 +7133,7 @@ def remove_term_from_category(self, folder_guid: str, term_guid: str, ----- """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_from_collection(folder_guid, term_guid, body)) + run_sync(self._async_remove_from_collection(folder_guid, term_guid, body)) # # @@ -7254,8 +7218,7 @@ def get_member_list(self, collection_guid: Optional[str] = None, collection_name If the root_collection_name does not have exactly one root collection. """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_member_list(collection_guid, collection_name, collection_qname)) return resp @@ -7402,8 +7365,7 @@ async def _async_update_agreement_item(self, agreement_item_relationship_guid: s def update_agreement_item(self, agreement_item_relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of an AgreementItem relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_agreement_item(agreement_item_relationship_guid, body)) + run_sync(self._async_update_agreement_item(agreement_item_relationship_guid, body)) @dynamic_catch async def _async_detach_agreement_item_by_id(self, agreement_item_relationship_guid: str, @@ -7416,8 +7378,7 @@ async def _async_detach_agreement_item_by_id(self, agreement_item_relationship_g def detach_agreement_item_by_id(self, agreement_item_relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach one specific AgreementItem relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_agreement_item_by_id(agreement_item_relationship_guid, body)) + run_sync(self._async_detach_agreement_item_by_id(agreement_item_relationship_guid, body)) @dynamic_catch async def _async_set_collection_kind(self, collection_guid: str, @@ -7432,8 +7393,7 @@ async def _async_set_collection_kind(self, collection_guid: str, def set_collection_kind(self, collection_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a collection with its collection kind.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_collection_kind(collection_guid, body)) + run_sync(self._async_set_collection_kind(collection_guid, body)) @dynamic_catch async def _async_clear_collection_kind(self, collection_guid: str, @@ -7446,8 +7406,7 @@ async def _async_clear_collection_kind(self, collection_guid: str, def clear_collection_kind(self, collection_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the CollectionKind classification from a collection.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_collection_kind(collection_guid, body)) + run_sync(self._async_clear_collection_kind(collection_guid, body)) if __name__ == "__main__": diff --git a/pyegeria/omvs/community_matters_omvs.py b/pyegeria/omvs/community_matters_omvs.py index 8676a061..0a2468fb 100644 --- a/pyegeria/omvs/community_matters_omvs.py +++ b/pyegeria/omvs/community_matters_omvs.py @@ -27,6 +27,7 @@ DeleteRelationshipRequestBody, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class CommunityMatters(ServerClient): @@ -79,8 +80,7 @@ async def _async_create_community(self, body: Optional[dict | NewElementRequestB @dynamic_catch def create_community(self, body: Optional[dict | NewElementRequestBody] = None) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_community(body)) + return run_sync(self._async_create_community(body)) # ----------------------------- # Create from template @@ -92,8 +92,7 @@ async def _async_create_community_from_template(self, body: dict | TemplateReque @dynamic_catch def create_community_from_template(self, body: dict | TemplateRequestBody) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_community_from_template(body)) + return run_sync(self._async_create_community_from_template(body)) # ----------------------------- # Update @@ -105,8 +104,7 @@ async def _async_update_community(self, community_guid: str, body: dict | Update @dynamic_catch def update_community(self, community_guid: str, body: dict | UpdateElementRequestBody) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_community(community_guid, body)) + run_sync(self._async_update_community(community_guid, body)) # ----------------------------- # Delete @@ -128,8 +126,7 @@ def delete_community( body: Optional[dict | DeleteElementRequestBody] = None, cascade: bool = False, ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_community(community_guid, body, cascade)) + run_sync(self._async_delete_community(community_guid, body, cascade)) # ----------------------------- # Get by name @@ -203,8 +200,7 @@ def get_communities_by_name( body: Optional[dict | FilterRequestBody] = None, **kwargs, ) -> list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_communities_by_name( filter_string=filter_string, metadata_element_subtypes=metadata_element_subtypes, @@ -389,8 +385,7 @@ def find_communities( List of community metadata elements or formatted string, depending on output_format. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_communities( search_string=search_string, starts_with=starts_with, @@ -455,8 +450,7 @@ def get_community_by_guid( body: Optional[dict | GetRequestBody] = None, **kwargs, ) -> dict | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_community_by_guid( community_guid=community_guid, include_only_relationships=include_only_relationships, @@ -490,8 +484,7 @@ def link_crowd_sourcing_contribution(self, element_guid: str, contributor_guid: """Attach a contributor to an element they crowd-sourced content for (CrowdSourcingContribution relationship). The relationship properties' `roleType` is a CrowdSourcingRole: PROPOSER, REVIEWER, SUPPORTER, APPROVER or OTHER.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_crowd_sourcing_contribution(element_guid, contributor_guid, body)) + run_sync(self._async_link_crowd_sourcing_contribution(element_guid, contributor_guid, body)) @dynamic_catch async def _async_detach_crowd_sourcing_contribution(self, element_guid: str, contributor_guid: str, @@ -504,5 +497,4 @@ async def _async_detach_crowd_sourcing_contribution(self, element_guid: str, con def detach_crowd_sourcing_contribution(self, element_guid: str, contributor_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a contributor from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_crowd_sourcing_contribution(element_guid, contributor_guid, body)) + run_sync(self._async_detach_crowd_sourcing_contribution(element_guid, contributor_guid, body)) diff --git a/pyegeria/omvs/connection_maker.py b/pyegeria/omvs/connection_maker.py index 7cc298c4..153f4482 100644 --- a/pyegeria/omvs/connection_maker.py +++ b/pyegeria/omvs/connection_maker.py @@ -21,6 +21,7 @@ ) from typing import Optional, List, Union, Any import asyncio +from pyegeria.core.async_runner import run_sync class ConnectionMaker(ServerClient): @@ -46,32 +47,28 @@ async def _async_create_connection(self, body: Union[NewElementRequestBody, dict return await self._async_create_element_body_request(url, ["ConnectionProperties"], body) def create_connection(self, body: Union[NewElementRequestBody, dict]) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_connection(body)) + return run_sync(self._async_create_connection(body)) async def _async_create_connection_from_template(self, body: Union[TemplateRequestBody, dict]) -> str: url = f"{self.base_url}/connections/from-template" return await self._async_create_element_from_template(url, body) def create_connection_from_template(self, body: Union[TemplateRequestBody, dict]) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_connection_from_template(body)) + return run_sync(self._async_create_connection_from_template(body)) async def _async_update_connection(self, connection_guid: str, body: Union[UpdateElementRequestBody, dict]): url = f"{self.base_url}/connections/{connection_guid}/update" await self._async_update_element_body_request(url, ["ConnectionProperties"], body) def update_connection(self, connection_guid: str, body: Union[UpdateElementRequestBody, dict]): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_connection(connection_guid, body)) + return run_sync(self._async_update_connection(connection_guid, body)) async def _async_delete_connection(self, connection_guid: str, body: Union[DeleteElementRequestBody, dict] = None): url = f"{self.base_url}/connections/{connection_guid}/delete" await self._async_delete_element_request(url, body) def delete_connection(self, connection_guid: str, body: Union[DeleteElementRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_connection(connection_guid, body)) + return run_sync(self._async_delete_connection(connection_guid, body)) async def _async_get_connection_by_guid( self, @@ -109,8 +106,7 @@ def get_connection_by_guid( body: Union[GetRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_connection_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -169,8 +165,7 @@ def get_connections_by_name( body: Union[FilterRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_connections_by_name( name=name, metadata_element_subtypes=metadata_element_subtypes, @@ -253,8 +248,7 @@ def find_connections( body: Union[SearchStringRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_connections( search_string=search_string, starts_with=starts_with, @@ -284,32 +278,28 @@ async def _async_create_connector_type(self, body: Union[NewElementRequestBody, return await self._async_create_element_body_request(url, ["ConnectorTypeProperties"], body) def create_connector_type(self, body: Union[NewElementRequestBody, dict]) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_connector_type(body)) + return run_sync(self._async_create_connector_type(body)) async def _async_create_connector_type_from_template(self, body: Union[TemplateRequestBody, dict]) -> str: url = f"{self.base_url}/connector-types/from-template" return await self._async_create_element_from_template(url, body) def create_connector_type_from_template(self, body: Union[TemplateRequestBody, dict]) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_connector_type_from_template(body)) + return run_sync(self._async_create_connector_type_from_template(body)) async def _async_update_connector_type(self, connector_type_guid: str, body: Union[UpdateElementRequestBody, dict]): url = f"{self.base_url}/connector-types/{connector_type_guid}/update" await self._async_update_element_body_request(url, ["ConnectorTypeProperties"], body) def update_connector_type(self, connector_type_guid: str, body: Union[UpdateElementRequestBody, dict]): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_connector_type(connector_type_guid, body)) + return run_sync(self._async_update_connector_type(connector_type_guid, body)) async def _async_delete_connector_type(self, connector_type_guid: str, body: Union[DeleteElementRequestBody, dict] = None): url = f"{self.base_url}/connector-types/{connector_type_guid}/delete" await self._async_delete_element_request(url, body) def delete_connector_type(self, connector_type_guid: str, body: Union[DeleteElementRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_connector_type(connector_type_guid, body)) + return run_sync(self._async_delete_connector_type(connector_type_guid, body)) async def _async_get_connector_type_by_guid( self, @@ -347,8 +337,7 @@ def get_connector_type_by_guid( body: Union[GetRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_connector_type_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -407,8 +396,7 @@ def get_connector_types_by_name( body: Union[FilterRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_connector_types_by_name( name=name, metadata_element_subtypes=metadata_element_subtypes, @@ -470,8 +458,7 @@ def get_connector_types_by_connector_provider_class_name( body: Union[FilterRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_connector_types_by_connector_provider_class_name( connector_provider_class_name=connector_provider_class_name, metadata_element_subtypes=metadata_element_subtypes, @@ -554,8 +541,7 @@ def find_connector_types( body: Union[SearchStringRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_connector_types( search_string=search_string, starts_with=starts_with, @@ -585,32 +571,28 @@ async def _async_create_endpoint(self, body: Union[NewElementRequestBody, dict]) return await self._async_create_element_body_request(url, ["EndpointProperties"], body) def create_endpoint(self, body: Union[NewElementRequestBody, dict]) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_endpoint(body)) + return run_sync(self._async_create_endpoint(body)) async def _async_create_endpoint_from_template(self, body: Union[TemplateRequestBody, dict]) -> str: url = f"{self.base_url}/endpoints/from-template" return await self._async_create_element_from_template(url, body) def create_endpoint_from_template(self, body: Union[TemplateRequestBody, dict]) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_endpoint_from_template(body)) + return run_sync(self._async_create_endpoint_from_template(body)) async def _async_update_endpoint(self, endpoint_guid: str, body: Union[UpdateElementRequestBody, dict]): url = f"{self.base_url}/endpoints/{endpoint_guid}/update" await self._async_update_element_body_request(url, ["EndpointProperties"], body) def update_endpoint(self, endpoint_guid: str, body: Union[UpdateElementRequestBody, dict]): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_endpoint(endpoint_guid, body)) + return run_sync(self._async_update_endpoint(endpoint_guid, body)) async def _async_delete_endpoint(self, endpoint_guid: str, body: Union[DeleteElementRequestBody, dict] = None): url = f"{self.base_url}/endpoints/{endpoint_guid}/delete" await self._async_delete_element_request(url, body) def delete_endpoint(self, endpoint_guid: str, body: Union[DeleteElementRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_endpoint(endpoint_guid, body)) + return run_sync(self._async_delete_endpoint(endpoint_guid, body)) async def _async_get_endpoint_by_guid( self, @@ -648,8 +630,7 @@ def get_endpoint_by_guid( body: Union[GetRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_endpoint_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -708,8 +689,7 @@ def get_endpoints_by_name( body: Union[FilterRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_endpoints_by_name( name=name, metadata_element_subtypes=metadata_element_subtypes, @@ -771,8 +751,7 @@ def get_endpoints_by_network_address( body: Union[FilterRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_endpoints_by_network_address( network_address=network_address, metadata_element_subtypes=metadata_element_subtypes, @@ -855,8 +834,7 @@ def find_endpoints( body: Union[SearchStringRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_endpoints( search_string=search_string, starts_with=starts_with, @@ -927,8 +905,7 @@ def get_endpoints_for_asset( body: Union[FilterRequestBody, dict] = None, **kwargs, ) -> dict | list | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_endpoints_for_asset( asset_guid=asset_guid, name=name, @@ -953,64 +930,56 @@ async def _async_link_connection_connector_type(self, connection_guid: str, conn await self._async_new_relationship_request(url, ["ConnectionConnectorTypeProperties"], body) def link_connection_connector_type(self, connection_guid: str, connector_type_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_connection_connector_type(connection_guid, connector_type_guid, body)) + return run_sync(self._async_link_connection_connector_type(connection_guid, connector_type_guid, body)) async def _async_detach_connection_connector_type(self, connection_guid: str, connector_type_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): url = f"{self.base_url}/connections/{connection_guid}/connector-types/{connector_type_guid}/detach" await self._async_delete_relationship_request(url, body) def detach_connection_connector_type(self, connection_guid: str, connector_type_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_connection_connector_type(connection_guid, connector_type_guid, body)) + return run_sync(self._async_detach_connection_connector_type(connection_guid, connector_type_guid, body)) async def _async_link_connection_endpoint(self, connection_guid: str, endpoint_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): url = f"{self.base_url}/connections/{connection_guid}/endpoints/{endpoint_guid}/attach" await self._async_new_relationship_request(url, ["ConnectToEndpointProperties"], body) def link_connection_endpoint(self, connection_guid: str, endpoint_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_connection_endpoint(connection_guid, endpoint_guid, body)) + return run_sync(self._async_link_connection_endpoint(connection_guid, endpoint_guid, body)) async def _async_detach_connection_endpoint(self, connection_guid: str, endpoint_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): url = f"{self.base_url}/connections/{connection_guid}/endpoints/{endpoint_guid}/detach" await self._async_delete_relationship_request(url, body) def detach_connection_endpoint(self, connection_guid: str, endpoint_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_connection_endpoint(connection_guid, endpoint_guid, body)) + return run_sync(self._async_detach_connection_endpoint(connection_guid, endpoint_guid, body)) async def _async_link_embedded_connection(self, connection_guid: str, embedded_connection_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): url = f"{self.base_url}/connections/{connection_guid}/embedded-connections/{embedded_connection_guid}/attach" await self._async_new_relationship_request(url, ["EmbeddedConnectionProperties"], body) def link_embedded_connection(self, connection_guid: str, embedded_connection_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_embedded_connection(connection_guid, embedded_connection_guid, body)) + return run_sync(self._async_link_embedded_connection(connection_guid, embedded_connection_guid, body)) async def _async_detach_embedded_connection(self, connection_guid: str, embedded_connection_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): url = f"{self.base_url}/connections/{connection_guid}/embedded-connections/{embedded_connection_guid}/detach" await self._async_delete_relationship_request(url, body) def detach_embedded_connection(self, connection_guid: str, embedded_connection_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_embedded_connection(connection_guid, embedded_connection_guid, body)) + return run_sync(self._async_detach_embedded_connection(connection_guid, embedded_connection_guid, body)) async def _async_link_asset_to_connection(self, asset_guid: str, connection_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): url = f"{self.base_url}/assets/{asset_guid}/connections/{connection_guid}/attach" await self._async_new_relationship_request(url, ["ResourceConnectionProperties"], body) def link_asset_to_connection(self, asset_guid: str, connection_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_asset_to_connection(asset_guid, connection_guid, body)) + return run_sync(self._async_link_asset_to_connection(asset_guid, connection_guid, body)) async def _async_detach_asset_from_connection(self, asset_guid: str, connection_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): url = f"{self.base_url}/assets/{asset_guid}/connections/{connection_guid}/detach" await self._async_delete_relationship_request(url, body) def detach_asset_from_connection(self, asset_guid: str, connection_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_asset_from_connection(asset_guid, connection_guid, body)) + return run_sync(self._async_detach_asset_from_connection(asset_guid, connection_guid, body)) # Generalisation of link_asset_to_connection / detach_asset_from_connection: any element that has a digital # resource (not only an asset) can be attached to the connection that accesses that resource. @@ -1037,8 +1006,7 @@ async def _async_link_resource_to_connection(self, element_guid: str, connection @dynamic_catch def link_resource_to_connection(self, element_guid: str, connection_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): """Attach an element to the connection that accesses its digital resource.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_resource_to_connection(element_guid, connection_guid, body)) + return run_sync(self._async_link_resource_to_connection(element_guid, connection_guid, body)) @dynamic_catch async def _async_detach_resource_from_connection(self, element_guid: str, connection_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): @@ -1049,21 +1017,18 @@ async def _async_detach_resource_from_connection(self, element_guid: str, connec @dynamic_catch def detach_resource_from_connection(self, element_guid: str, connection_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): """Detach an element from the connection that accesses its digital resource.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_resource_from_connection(element_guid, connection_guid, body)) + return run_sync(self._async_detach_resource_from_connection(element_guid, connection_guid, body)) async def _async_link_endpoint_to_it_asset(self, asset_guid: str, endpoint_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): url = f"{self.base_url}/assets/{asset_guid}/endpoints/{endpoint_guid}/attach" await self._async_new_relationship_request(url, ["ServerEndpointProperties"], body) def link_endpoint_to_it_asset(self, asset_guid: str, endpoint_guid: str, body: Union[NewRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_endpoint_to_it_asset(asset_guid, endpoint_guid, body)) + return run_sync(self._async_link_endpoint_to_it_asset(asset_guid, endpoint_guid, body)) async def _async_detach_endpoint_from_it_asset(self, asset_guid: str, endpoint_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): url = f"{self.base_url}/assets/{asset_guid}/endpoints/{endpoint_guid}/detach" await self._async_delete_relationship_request(url, body) def detach_endpoint_from_it_asset(self, asset_guid: str, endpoint_guid: str, body: Union[DeleteRelationshipRequestBody, dict] = None): - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_endpoint_from_it_asset(asset_guid, endpoint_guid, body)) + return run_sync(self._async_detach_endpoint_from_it_asset(asset_guid, endpoint_guid, body)) diff --git a/pyegeria/omvs/data_designer.py b/pyegeria/omvs/data_designer.py index 959797fb..00b024c2 100644 --- a/pyegeria/omvs/data_designer.py +++ b/pyegeria/omvs/data_designer.py @@ -20,6 +20,7 @@ from pyegeria.view.output_formatter import (extract_mermaid_only, extract_basic_dict, populate_common_columns) from pyegeria.core.utils import dynamic_catch from typing import Any, Optional +from pyegeria.core.async_runner import run_sync class DataDesigner(ServerClient): @@ -163,8 +164,7 @@ def find_data_value_specifications( list | str The search results. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_data_value_specifications( search_string, graph_query_depth=graph_query_depth, @@ -235,8 +235,7 @@ def link_specialized_data_value_specification( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_specialized_data_value_specification(spec_guid, grain_guid, body)) + run_sync(self._async_link_specialized_data_value_specification(spec_guid, grain_guid, body)) @dynamic_catch async def _async_detach_specialized_data_value_specification( @@ -298,8 +297,7 @@ def detach_specialized_data_value_specification( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_specialized_data_value_specification(spec_guid, grain_guid, body, cascade_delete) ) @@ -354,8 +352,7 @@ def delete_data_value_specification(self, guid: str, body: dict | None = None, c PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_data_value_specification(guid, body, cascade_delete)) + run_sync(self._async_delete_data_value_specification(guid, body, cascade_delete)) @dynamic_catch async def _async_create_data_value_specification(self, body: dict | NewElementRequestBody) -> str: @@ -400,8 +397,7 @@ def create_data_value_specification(self, body: dict | NewElementRequestBody) -> PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_data_value_specification(body)) + return run_sync(self._async_create_data_value_specification(body)) @dynamic_catch async def _async_create_data_value_specification_from_template( @@ -452,8 +448,7 @@ def create_data_value_specification_from_template( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_data_value_specification_from_template(body)) + return run_sync(self._async_create_data_value_specification_from_template(body)) @dynamic_catch async def _async_create_data_grain(self, body: dict | NewElementRequestBody) -> str: @@ -498,8 +493,7 @@ def create_data_grain(self, body: dict | NewElementRequestBody) -> str: PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_data_grain(body)) + return run_sync(self._async_create_data_grain(body)) # # DataDesigner is a class that extends the Client class. The Data Designer OMVS provides APIs for # building specifications for data. This includes common data fields in a data dictionary, data specifications @@ -539,8 +533,7 @@ def create_data_class(self, body: dict | NewElementRequestBody) -> str: str The GUID of the element - or "No element found" """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_data_class(body)) + return run_sync(self._async_create_data_class(body)) @dynamic_catch async def _async_delete_data_class(self, data_class_guid: str, body: dict = None, @@ -603,8 +596,7 @@ def delete_data_class(self, data_class_guid: str, body: dict = None, cascade_del PyegeriaUnauthorizedException the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_data_class(data_class_guid, body, cascade_delete)) + run_sync(self._async_delete_data_class(data_class_guid, body, cascade_delete)) # # Data Structures @@ -749,8 +741,7 @@ def create_data_structure(self, body: dict | NewElementRequestBody) -> str: """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_data_structure(body)) return response @@ -899,8 +890,7 @@ def create_data_structure_from_template(self, body: dict | TemplateRequestBody) """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_data_structure_from_template(body)) + response = run_sync(self._async_create_data_structure_from_template(body)) return response @dynamic_catch @@ -963,8 +953,7 @@ def find_all_data_structures(self, graph_query_depth: int = 3, output_format: st """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_find_all_data_structures(output_format=output_format, + return run_sync(self._async_find_all_data_structures(output_format=output_format, report_spec=report_spec)) @dynamic_catch @@ -1133,8 +1122,7 @@ def find_data_structures( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_data_structures( search_string=search_string, graph_query_depth=graph_query_depth, @@ -1264,8 +1252,7 @@ def get_data_structures_by_name(self, name: Optional[str] = None, classification """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_data_structures_by_name(name=name, classification_names=classification_names, body=body, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -1387,8 +1374,7 @@ def get_data_structure_by_guid(self, guid: str = None, element_type: Optional[st """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_data_structure_by_guid(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -1916,8 +1902,7 @@ def create_data_field(self, body: dict | NewElementRequestBody) -> str: """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_data_field(body)) + response = run_sync(self._async_create_data_field(body)) return response @dynamic_catch @@ -1979,8 +1964,7 @@ def delete_data_field(self, data_field_guid: str, body: dict = None, cascade_del PyegeriaUnauthorizedException the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_data_field(data_field_guid, body, cascade_delete)) + run_sync(self._async_delete_data_field(data_field_guid, body, cascade_delete)) @dynamic_catch async def _async_create_data_field_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -2126,8 +2110,7 @@ def create_data_field_from_template(self, body: dict | TemplateRequestBody) -> s """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_data_field_from_template(body)) + response = run_sync(self._async_create_data_field_from_template(body)) return response @dynamic_catch @@ -2238,8 +2221,7 @@ def update_data_structure(self, data_struct_guid: str, body: dict | UpdateElemen """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_data_structure(data_struct_guid, body)) @dynamic_catch @@ -2351,8 +2333,7 @@ def link_member_data_field(self, parent_data_struct_guid: str, member_data_field """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_member_data_field(parent_data_struct_guid, member_data_field_guid, body)) @dynamic_catch @@ -2457,8 +2438,7 @@ def detach_member_data_field(self, parent_data_struct_guid: str, member_data_fie """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_member_data_field(parent_data_struct_guid, member_data_field_guid, body, cascade_delete)) @@ -2475,8 +2455,7 @@ async def _async_link_nested_data_field(self, parent_data_field_guid: str, neste def link_nested_data_field(self, parent_data_field_guid: str, nested_data_field_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Link a nested data field to a parent data field (NestedDataField relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_nested_data_field(parent_data_field_guid, nested_data_field_guid, body)) + run_sync(self._async_link_nested_data_field(parent_data_field_guid, nested_data_field_guid, body)) @dynamic_catch async def _async_detach_nested_data_field(self, parent_data_field_guid: str, nested_data_field_guid: str, @@ -2491,8 +2470,7 @@ async def _async_detach_nested_data_field(self, parent_data_field_guid: str, nes def detach_nested_data_field(self, parent_data_field_guid: str, nested_data_field_guid: str, body: Optional[dict] = None, cascade_delete: bool = False) -> None: """Detach a nested data field from its parent data field.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_nested_data_field( + run_sync(self._async_detach_nested_data_field( parent_data_field_guid, nested_data_field_guid, body, cascade_delete)) @dynamic_catch @@ -2593,8 +2571,7 @@ def delete_data_structure(self, data_struct_guid: str, body: dict = None, cascad """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_data_structure(data_struct_guid, body, cascade_delete)) + run_sync(self._async_delete_data_structure(data_struct_guid, body, cascade_delete)) @dynamic_catch async def _async_find_all_data_fields(self, graph_query_depth: int = 3, output_format: str = 'JSON', @@ -2663,8 +2640,7 @@ def find_all_data_fields(self, graph_query_depth: int = 3, output_format: str = """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_all_data_fields(graph_query_depth, output_format, report_spec, body)) return response @@ -2874,8 +2850,7 @@ def find_data_fields(self, search_string: str, """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_data_fields( search_string, body=body, @@ -2994,8 +2969,7 @@ def get_data_fields_by_name(self, filter_string: str | None = None, classificati """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_data_fields_by_name(filter_string=filter_string, classification_names=classification_names, body=body, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -3020,8 +2994,7 @@ def get_data_field_by_guid(self, guid: str, element_type: Optional[str] = None, body: Optional[dict] = None, graph_query_depth: int = 3, output_format: str = 'JSON', report_spec: str | dict = None, **kwargs) -> list | str: """Get a data field by its GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_data_field_by_guid(guid, element_type, body, graph_query_depth, output_format, report_spec, **kwargs)) @dynamic_catch @@ -3128,8 +3101,7 @@ def get_data_value_specifications_by_name(self, filter_string: str | None = None """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_data_value_specifications_by_name(filter_string, classification_names, body, start_from, page_size, graph_query_depth, output_format, report_spec, **kwargs)) @@ -3242,8 +3214,7 @@ def get_data_value_specification_by_guid(self, guid: str, element_type: Optional """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_data_value_specification_by_guid(guid, element_type, body, graph_query_depth, output_format, report_spec, **kwargs)) return response @@ -3279,8 +3250,7 @@ def get_data_class_by_guid(self, guid: str = None, element_type: Optional[str] = graph_query_depth: int = 3, output_format: str = 'JSON', report_spec: str | dict = None, **kwargs) -> list | str: """Get a data class by its GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_data_class_by_guid(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) @dynamic_catch @@ -3289,8 +3259,7 @@ def get_data_grain_by_guid(self, guid: str = None, element_type: Optional[str] = graph_query_depth: int = 3, output_format: str = 'JSON', report_spec: str | dict = None, **kwargs) -> list | str: """Get a data grain by its GUID. Alias for get_data_value_specification_by_guid with DataGrain type.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_data_value_specification_by_guid( guid=guid, element_type=element_type or "DataGrain", body=body, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -3480,8 +3449,7 @@ def create_data_classification(self, body: dict | NewElementRequestBody) -> str: """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_data_classification(body)) + response = run_sync(self._async_create_data_classification(body)) return response @dynamic_catch @@ -3619,8 +3587,7 @@ def update_data_classification(self, data_classification_guid: str, body: dict | """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_data_classification(data_classification_guid, body)) + run_sync(self._async_update_data_classification(data_classification_guid, body)) @dynamic_catch async def _async_link_data_classification_to_data_field(self, data_classification_guid: str, data_field_guid: str, @@ -3728,8 +3695,7 @@ def link_data_classification_to_data_field(self, data_classification_guid: str, """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_data_classification_to_data_field(data_classification_guid, data_field_guid, body)) @dynamic_catch @@ -3830,8 +3796,7 @@ def detach_data_classification_from_data_field(self, data_classification_guid: s """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_data_classification_from_data_field(data_classification_guid, data_field_guid, body, cascade_delete)) ### @@ -3937,8 +3902,7 @@ def link_data_class_definition(self, data_definition_guid: str, data_class_guid: """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_data_class_definition(data_definition_guid, data_class_guid, body)) + run_sync(self._async_link_data_class_definition(data_definition_guid, data_class_guid, body)) @dynamic_catch async def _async_detach_data_class_definition(self, data_definition_guid: str, data_class_guid: str, @@ -4037,8 +4001,7 @@ def detach_data_class_definition(self, data_definition_guid: str, data_class_gui """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_data_class_definition(data_definition_guid, data_class_guid, body, cascade_delete)) @@ -4055,8 +4018,7 @@ async def _async_link_nested_data_class(self, parent_data_class_guid: str, child def link_nested_data_class(self, parent_data_class_guid: str, child_data_class_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Link a child data class to a parent via DataClassComposition relationship.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_nested_data_class(parent_data_class_guid, child_data_class_guid, body)) + run_sync(self._async_link_nested_data_class(parent_data_class_guid, child_data_class_guid, body)) @dynamic_catch async def _async_detach_nested_data_class(self, parent_data_class_guid: str, child_data_class_guid: str, @@ -4071,8 +4033,7 @@ async def _async_detach_nested_data_class(self, parent_data_class_guid: str, chi def detach_nested_data_class(self, parent_data_class_guid: str, child_data_class_guid: str, body: Optional[dict] = None, cascade_delete: bool = False) -> None: """Detach a child data class from its parent (DataClassComposition).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_nested_data_class( + run_sync(self._async_detach_nested_data_class( parent_data_class_guid, child_data_class_guid, body, cascade_delete)) @dynamic_catch @@ -4173,8 +4134,7 @@ def link_semantic_definition(self, data_definition_guid: str, glossary_term_guid """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_semantic_definition(data_definition_guid, glossary_term_guid, body)) + run_sync(self._async_link_semantic_definition(data_definition_guid, glossary_term_guid, body)) @dynamic_catch async def _async_detach_semantic_definition(self, data_definition_guid: str, glossary_term_guid: str, @@ -4272,8 +4232,7 @@ def detach_semantic_definition(self, data_definition_guid: str, glossary_term_gu """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_semantic_definition(data_definition_guid, glossary_term_guid, body, cascade_delete)) @@ -4381,8 +4340,7 @@ def link_certification_type_to_data_structure(self, certification_type_guid: str """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_certification_type_to_data_structure(certification_type_guid, data_structure_guid, body)) async def _async_detach_certification_type_from_data_structure(self, certification_type_guid: str, @@ -4478,8 +4436,7 @@ def detach_certification_type_from_data_structure(self, certification_type_guid: """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_certification_type_from_data_structure(certification_type_guid, data_structure_guid, body, cascade_delete)) @@ -4853,8 +4810,7 @@ def link_data_value_assignment(self, element_guid: str, spec_guid: str, body: di """ Link a Data Value Specification to an element (DataValueAssignment relationship). Sync version. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_data_value_assignment(element_guid, spec_guid, body)) + run_sync(self._async_link_data_value_assignment(element_guid, spec_guid, body)) @dynamic_catch async def _async_detach_data_value_assignment(self, element_guid: str, spec_guid: str, body: dict = None) -> None: @@ -4870,8 +4826,7 @@ def detach_data_value_assignment(self, element_guid: str, spec_guid: str, body: """ Detach a Data Value Specification from an element (DataValueAssignment relationship). Sync version. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_data_value_assignment(element_guid, spec_guid, body)) + run_sync(self._async_detach_data_value_assignment(element_guid, spec_guid, body)) @dynamic_catch async def _async_update_data_field(self, data_field_guid: str, body: dict | UpdateElementRequestBody) -> None: @@ -4892,8 +4847,7 @@ async def _async_update_data_field(self, data_field_guid: str, body: dict | Upda @dynamic_catch def update_data_field(self, data_field_guid: str, body: dict | UpdateElementRequestBody) -> None: """Update the properties of a data field.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_data_field(data_field_guid, body)) + run_sync(self._async_update_data_field(data_field_guid, body)) @dynamic_catch async def _async_update_data_value_specification(self, guid: str, body: dict | UpdateElementRequestBody) -> None: @@ -4926,8 +4880,7 @@ def update_data_value_specification(self, guid: str, body: dict | UpdateElementR ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_data_value_specification(guid, body)) + run_sync(self._async_update_data_value_specification(guid, body)) # # Additional relationship maintenance - added to close the gap found by @@ -4948,8 +4901,7 @@ async def _async_link_linked_data_field(self, data_field_one_guid: str, data_fie def link_linked_data_field(self, data_field_one_guid: str, data_field_two_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach two related data fields (LinkedDataField relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_linked_data_field(data_field_one_guid, data_field_two_guid, body)) + run_sync(self._async_link_linked_data_field(data_field_one_guid, data_field_two_guid, body)) @dynamic_catch async def _async_detach_linked_data_field(self, data_field_one_guid: str, data_field_two_guid: str, @@ -4965,8 +4917,7 @@ def detach_linked_data_field(self, data_field_one_guid: str, data_field_two_guid body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach two related data fields.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_linked_data_field( + run_sync(self._async_detach_linked_data_field( data_field_one_guid, data_field_two_guid, body, cascade_delete)) @dynamic_catch @@ -4981,8 +4932,7 @@ async def _async_link_schema_attribute_definition(self, data_field_guid: str, sc def link_schema_attribute_definition(self, data_field_guid: str, schema_attribute_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a data field to the schema attribute that defines it (SchemaAttributeDefinition relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_schema_attribute_definition(data_field_guid, schema_attribute_guid, body)) + run_sync(self._async_link_schema_attribute_definition(data_field_guid, schema_attribute_guid, body)) @dynamic_catch async def _async_detach_schema_attribute_definition(self, data_field_guid: str, schema_attribute_guid: str, @@ -4998,8 +4948,7 @@ def detach_schema_attribute_definition(self, data_field_guid: str, schema_attrib body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a data field from the schema attribute that defines it.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_schema_attribute_definition( + run_sync(self._async_detach_schema_attribute_definition( data_field_guid, schema_attribute_guid, body, cascade_delete)) @dynamic_catch @@ -5014,8 +4963,7 @@ async def _async_link_schema_type_definition(self, data_structure_guid: str, sch def link_schema_type_definition(self, data_structure_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a data structure to the schema type that defines it (SchemaTypeDefinition relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_schema_type_definition(data_structure_guid, schema_type_guid, body)) + run_sync(self._async_link_schema_type_definition(data_structure_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_schema_type_definition(self, data_structure_guid: str, schema_type_guid: str, @@ -5031,8 +4979,7 @@ def detach_schema_type_definition(self, data_structure_guid: str, schema_type_gu body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a data structure from the schema type that defines it.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_schema_type_definition( + run_sync(self._async_detach_schema_type_definition( data_structure_guid, schema_type_guid, body, cascade_delete)) diff --git a/pyegeria/omvs/data_discovery.py b/pyegeria/omvs/data_discovery.py index f52ea3f7..04c4ced9 100644 --- a/pyegeria/omvs/data_discovery.py +++ b/pyegeria/omvs/data_discovery.py @@ -30,6 +30,7 @@ overlay_additional_values, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync @@ -164,8 +165,7 @@ def create_annotation(self, body: dict | NewElementRequestBody) -> str: } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_annotation(body)) + return run_sync(self._async_create_annotation(body)) @dynamic_catch async def _async_create_annotation_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -247,8 +247,7 @@ def create_annotation_from_template(self, body: dict | TemplateRequestBody) -> s } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_annotation_from_template(body)) + return run_sync(self._async_create_annotation_from_template(body)) @dynamic_catch async def _async_update_annotation( @@ -322,8 +321,7 @@ def update_annotation(self, annotation_guid: str, body: dict | UpdateElementRequ } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_annotation(annotation_guid, body)) + run_sync(self._async_update_annotation(annotation_guid, body)) async def _async_attach_annotation_to_report( self, @@ -370,8 +368,7 @@ def attach_annotation_to_report( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_attach_annotation_to_report(survey_report_guid, annotation_guid, body) ) @@ -420,8 +417,7 @@ def detach_annotation_from_report( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_annotation_from_report(survey_report_guid, annotation_guid, body) ) @@ -470,8 +466,7 @@ def link_annotation_to_described_element( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_annotation_to_described_element(annotation_guid, element_guid, body) ) @@ -493,8 +488,7 @@ def detach_annotation_from_described_element( body: dict | DeleteRelationshipRequestBody, ) -> None: """Detach an annotation from the element it describes.""" - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_annotation_from_described_element(annotation_guid, element_guid, body) ) @@ -543,8 +537,7 @@ def link_annotation_to_its_predecessor( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_annotation_to_its_predecessor(annotation_guid, predecessor_guid, body) ) @@ -593,8 +586,7 @@ def detach_annotation_from_its_predecessor( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_annotation_from_its_predecessor(annotation_guid, predecessor_guid, body) ) @@ -643,8 +635,7 @@ def link_resource_profile_data( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_resource_profile_data(annotation_guid, element_guid, body) ) @@ -693,8 +684,7 @@ def detach_resource_profile_data( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_resource_profile_data(annotation_guid, element_guid, body) ) @@ -743,8 +733,7 @@ def link_annotation_match( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_annotation_match(annotation_guid, element_guid, body) ) @@ -793,8 +782,7 @@ def detach_annotation_match( ------- None """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_annotation_match(annotation_guid, element_guid, body) ) @@ -862,8 +850,7 @@ def delete_annotation(self, annotation_guid: str, body: Optional[dict | DeleteEl } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_annotation(annotation_guid, body)) + run_sync(self._async_delete_annotation(annotation_guid, body)) @dynamic_catch async def _async_get_annotations_by_name( @@ -990,8 +977,7 @@ def get_annotations_by_name( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_annotations_by_name( name=name, classification_names=classification_names, @@ -1055,8 +1041,7 @@ def get_annotations_by_analysis_step( **kwargs, ) -> str | list[dict]: """Get annotations by analysis step.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_annotations_by_analysis_step( analysis_step, body, start_from, page_size, output_format, report_spec, **kwargs ) @@ -1112,8 +1097,7 @@ def get_annotations_by_annotation_type( **kwargs, ) -> str | list[dict]: """Get annotations by annotation type.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_annotations_by_annotation_type( annotation_type, body, start_from, page_size, output_format, report_spec, **kwargs ) @@ -1167,8 +1151,7 @@ def get_annotations_for_element( **kwargs, ) -> str | list[dict]: """Get the annotations associated with an element.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_annotations_for_element( element_guid, body, start_from, page_size, output_format, report_spec, **kwargs ) @@ -1222,8 +1205,7 @@ def get_new_annotations( **kwargs, ) -> str | list[dict]: """Get the new annotations for a survey report.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_new_annotations( survey_report_guid, body, start_from, page_size, output_format, report_spec, **kwargs ) @@ -1277,8 +1259,7 @@ def get_annotation_extensions( **kwargs, ) -> str | list[dict]: """Get the annotations that extend an annotation.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_annotation_extensions( annotation_guid, body, start_from, page_size, output_format, report_spec, **kwargs ) @@ -1332,8 +1313,7 @@ def get_previous_annotations( **kwargs, ) -> str | list[dict]: """Get the annotations that precede an annotation.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_previous_annotations( annotation_guid, body, start_from, page_size, output_format, report_spec, **kwargs ) @@ -1535,8 +1515,7 @@ def find_annotations( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_annotations( search_string=search_string, graph_query_depth=graph_query_depth, @@ -1662,8 +1641,7 @@ def get_annotation_by_guid( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_annotation_by_guid( guid=guid, element_type=element_type, @@ -1831,8 +1809,7 @@ def get_security_findings( See _async_get_security_findings. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_security_findings(report_guid, element_guid, min_severity, finding_types, output_format, report_spec, **kwargs) ) @@ -1898,8 +1875,7 @@ def get_security_posture_history( See _async_get_security_posture_history. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_security_posture_history(report_qualified_name_prefix, output_format, report_spec, **kwargs) ) @@ -1945,8 +1921,7 @@ async def _async_create_analysis_report(self, body: dict | NewElementRequestBody def create_analysis_report(self, body: dict | NewElementRequestBody) -> str: """Deprecated - use AssetMaker.create_asset(["SurveyReportProperties"], body).""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_analysis_report(body)) + return run_sync(self._async_create_analysis_report(body)) @dynamic_catch async def _async_update_analysis_report(self, report_guid: str, body: dict | UpdateElementRequestBody) -> None: @@ -1956,8 +1931,7 @@ async def _async_update_analysis_report(self, report_guid: str, body: dict | Upd def update_analysis_report(self, report_guid: str, body: dict | UpdateElementRequestBody) -> None: """Deprecated - use AssetMaker.update_asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_analysis_report(report_guid, body)) + run_sync(self._async_update_analysis_report(report_guid, body)) @dynamic_catch async def _async_delete_analysis_report(self, report_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: @@ -1967,8 +1941,7 @@ async def _async_delete_analysis_report(self, report_guid: str, body: Optional[d def delete_analysis_report(self, report_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: """Deprecated - use AssetMaker.delete_asset.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_analysis_report(report_guid, body)) + run_sync(self._async_delete_analysis_report(report_guid, body)) @dynamic_catch async def _async_get_analysis_reports_by_name(self, name: str | None = None, start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: @@ -1981,8 +1954,7 @@ async def _async_get_analysis_reports_by_name(self, name: str | None = None, sta def get_analysis_reports_by_name(self, name: str | None = None, start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: """Deprecated - use AssetMaker.get_assets_by_name(name, metadata_element_type_name="SurveyReport").""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_analysis_reports_by_name(name, start_from, page_size, **kwargs)) + return run_sync(self._async_get_analysis_reports_by_name(name, start_from, page_size, **kwargs)) @dynamic_catch async def _async_find_analysis_reports(self, search_string: str = "*", start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: @@ -1995,8 +1967,7 @@ async def _async_find_analysis_reports(self, search_string: str = "*", start_fro def find_analysis_reports(self, search_string: str = "*", start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: """Deprecated - use AssetMaker.find_assets(search_string, metadata_element_type="SurveyReport").""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_find_analysis_reports(search_string, start_from, page_size, **kwargs)) + return run_sync(self._async_find_analysis_reports(search_string, start_from, page_size, **kwargs)) @dynamic_catch async def _async_get_analysis_report_by_guid(self, guid: str, **kwargs) -> dict | str: @@ -2006,8 +1977,7 @@ async def _async_get_analysis_report_by_guid(self, guid: str, **kwargs) -> dict def get_analysis_report_by_guid(self, guid: str, **kwargs) -> dict | str: """Deprecated - use AssetMaker.get_asset_by_guid.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_analysis_report_by_guid(guid, **kwargs)) + return run_sync(self._async_get_analysis_report_by_guid(guid, **kwargs)) # # Linking (deprecated): a report is linked to its subject with the ReportSubject relationship. @@ -2021,8 +1991,7 @@ async def _async_link_analysis_report_to_asset(self, analysis_report_guid: str, def link_analysis_report_to_asset(self, analysis_report_guid: str, asset_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Deprecated - use AssetMaker.link_report_subject(asset_guid, report_guid).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_analysis_report_to_asset(analysis_report_guid, asset_guid, body)) + run_sync(self._async_link_analysis_report_to_asset(analysis_report_guid, asset_guid, body)) @dynamic_catch async def _async_detach_analysis_report_from_asset(self, analysis_report_guid: str, asset_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -2032,8 +2001,7 @@ async def _async_detach_analysis_report_from_asset(self, analysis_report_guid: s def detach_analysis_report_from_asset(self, analysis_report_guid: str, asset_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Deprecated - use AssetMaker.unlink_report_subject(asset_guid, report_guid).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_analysis_report_from_asset(analysis_report_guid, asset_guid, body)) + run_sync(self._async_detach_analysis_report_from_asset(analysis_report_guid, asset_guid, body)) @dynamic_catch @@ -2044,8 +2012,7 @@ async def _async_link_request_for_action_target(self, annotation_guid: str, elem def link_request_for_action_target(self, annotation_guid: str, element_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Link a request for action target.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_request_for_action_target(annotation_guid, element_guid, body)) + run_sync(self._async_link_request_for_action_target(annotation_guid, element_guid, body)) @dynamic_catch async def _async_detach_request_for_action_target(self, annotation_guid: str, element_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -2055,5 +2022,4 @@ async def _async_detach_request_for_action_target(self, annotation_guid: str, el def detach_request_for_action_target(self, annotation_guid: str, element_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a request for action target.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_request_for_action_target(annotation_guid, element_guid, body)) + run_sync(self._async_detach_request_for_action_target(annotation_guid, element_guid, body)) diff --git a/pyegeria/omvs/data_engineer.py b/pyegeria/omvs/data_engineer.py index c3eccc6f..fe48278f 100644 --- a/pyegeria/omvs/data_engineer.py +++ b/pyegeria/omvs/data_engineer.py @@ -15,6 +15,7 @@ from pyegeria.models import SearchStringRequestBody from pyegeria.view.output_formatter import _generate_default_output from typing import Any, Optional +from pyegeria.core.async_runner import run_sync class DataEngineer(ServerClient): """ @@ -268,8 +269,7 @@ def find_tabular_data_sets( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_tabular_data_sets( search_string=search_string, graph_query_depth=graph_query_depth, @@ -311,8 +311,7 @@ def get_tabular_data_set(self, guid: str = None, start_from_row: int = 0, max_ro One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_tabular_data_set(guid=guid, start_from_row=start_from_row, max_row_count=max_row_count, output_format=output_format, **kwargs) ) return response diff --git a/pyegeria/omvs/digital_business.py b/pyegeria/omvs/digital_business.py index dbe5a9ab..09085c6d 100644 --- a/pyegeria/omvs/digital_business.py +++ b/pyegeria/omvs/digital_business.py @@ -25,6 +25,7 @@ ) from pyegeria.core.utils import dynamic_catch, body_slimmer +from pyegeria.core.async_runner import run_sync class DigitalBusiness(CollectionManager): @@ -184,8 +185,7 @@ def create_business_capability( If there are issues in communications, message format, or Egeria errors. """ body = self._prepare_body(body) - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_business_capability(body)) + return run_sync(self._async_create_business_capability(body)) @dynamic_catch async def _async_update_business_capability( @@ -243,8 +243,7 @@ def update_business_capability( """ business_capability_guid = str(business_capability_guid) body = self._prepare_body(body) - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_business_capability(business_capability_guid, body) ) @@ -311,8 +310,7 @@ def delete_business_capability( business_capability_guid = str(business_capability_guid) body = self._prepare_body(body) cascade = bool(cascade) - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_delete_business_capability(business_capability_guid, body, cascade) ) @@ -400,8 +398,7 @@ def get_business_capability_by_guid( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_business_capability_by_guid( guid=guid, graph_query_depth=graph_query_depth, @@ -551,8 +548,7 @@ def get_business_capabilities_by_name( if name is None and body is None: name = "*" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_business_capabilities_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -730,8 +726,7 @@ def find_business_capabilities( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_business_capabilities( search_string=search_string, starts_with=starts_with, @@ -821,8 +816,7 @@ def link_business_capability_dependency( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_business_capability_dependency( business_capability_guid, supporting_capability_guid, body ) @@ -893,8 +887,7 @@ def detach_business_capability_dependency( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_business_capability_dependency(business_capability_guid, supporting_capability_guid, body, cascade) ) @@ -962,8 +955,7 @@ def link_digital_support( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_digital_support(business_capability_guid, element_guid, body) ) @@ -1036,8 +1028,7 @@ def detach_digital_support( Args: cascade (): """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_digital_support(business_capability_guid, element_guid, body, cascade) ) @@ -1095,8 +1086,7 @@ def set_business_significant( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_business_significant(element_guid, body)) + run_sync(self._async_set_business_significant(element_guid, body)) @dynamic_catch async def _async_clear_business_significance( @@ -1148,8 +1138,7 @@ def clear_business_significance( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_business_significance(element_guid, body)) + run_sync(self._async_clear_business_significance(element_guid, body)) # # Additional classification maintenance - added to close the gap found # by scripts/omvs_audit.py against the digital-business .http ground @@ -1169,8 +1158,7 @@ async def _async_set_agreement_as_data_sharing_agreement(self, agreement_guid: s def set_agreement_as_data_sharing_agreement(self, agreement_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an agreement as a data sharing agreement.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_agreement_as_data_sharing_agreement(agreement_guid, body)) + run_sync(self._async_set_agreement_as_data_sharing_agreement(agreement_guid, body)) @dynamic_catch async def _async_clear_agreement_as_data_sharing_agreement(self, agreement_guid: str, @@ -1183,5 +1171,4 @@ async def _async_clear_agreement_as_data_sharing_agreement(self, agreement_guid: def clear_agreement_as_data_sharing_agreement(self, agreement_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the DataSharingAgreement classification from an agreement.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_agreement_as_data_sharing_agreement(agreement_guid, body)) + run_sync(self._async_clear_agreement_as_data_sharing_agreement(agreement_guid, body)) diff --git a/pyegeria/omvs/external_links.py b/pyegeria/omvs/external_links.py index 15bb320e..b74dda82 100644 --- a/pyegeria/omvs/external_links.py +++ b/pyegeria/omvs/external_links.py @@ -37,6 +37,7 @@ EXTERNAL_ID_LINK_PROPS = ["ExternalIdLinkProperties"] from pyegeria.core._server_client import ServerClient +from pyegeria.core.async_runner import run_sync class ExternalReferences(ServerClient): @@ -284,7 +285,7 @@ def create_external_reference(self, body: Optional[dict | NewElementRequestBody] """ - return asyncio.get_event_loop().run_until_complete(self._async_create_external_reference(body)) + return run_sync(self._async_create_external_reference(body)) ####### @@ -409,8 +410,7 @@ def create_external_reference_from_template(self, body: Optional[dict | Template } } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_external_reference_from_template(body)) + resp = run_sync(self._async_create_external_reference_from_template(body)) return resp # @@ -530,7 +530,7 @@ def update_external_reference(self, external_reference_guid: str, body: dict | N } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_external_reference(external_reference_guid, body)) @dynamic_catch @@ -637,8 +637,7 @@ def link_external_reference(self, element_guid: str, ext_ref_guid: str, } } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_external_reference(element_guid, ext_ref_guid, body)) + return run_sync(self._async_link_external_reference(element_guid, ext_ref_guid, body)) @dynamic_catch async def _async_detach_external_reference(self, element_guid: str, ext_ref_guid: str, @@ -721,8 +720,7 @@ def detach_external_reference(self, element_guid: str, ext_ref_guid: str, body: "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_external_reference(element_guid, ext_ref_guid, body)) + run_sync(self._async_detach_external_reference(element_guid, ext_ref_guid, body)) @dynamic_catch async def _async_link_media_reference(self, element_guid: str, media_ref_guid: str, @@ -831,8 +829,7 @@ def link_media_reference(self, element_guid: str, media_ref_guid: str, } } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_media_reference(element_guid, media_ref_guid, body)) + return run_sync(self._async_link_media_reference(element_guid, media_ref_guid, body)) @dynamic_catch async def _async_detach_media_reference(self, element_guid: str, media_ref_guid: str, @@ -917,8 +914,7 @@ def detach_media_reference(self, element_guid: str, media_ref_guid: str, body: O "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_media_reference(element_guid, media_ref_guid, body)) + run_sync(self._async_detach_media_reference(element_guid, media_ref_guid, body)) @dynamic_catch async def _async_link_cited_document(self, element_guid: str, cited_doc_guid: str, @@ -1020,8 +1016,7 @@ def link_cited_document(self, element_guid: str, cited_doc_guid: str, } } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_cited_document(element_guid, cited_doc_guid, body)) + return run_sync(self._async_link_cited_document(element_guid, cited_doc_guid, body)) @dynamic_catch async def _async_detach_cited_document(self, element_guid: str, cited_doc_guid: str, @@ -1105,8 +1100,7 @@ def detach_cited_document(self, element_guid: str, cited_doc_guid: str, body: Op "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_cited_document(element_guid, cited_doc_guid, body)) + run_sync(self._async_detach_cited_document(element_guid, cited_doc_guid, body)) # # do deletes etc @@ -1199,8 +1193,7 @@ def delete_external_reference(self, ext_ref_guid: str, body: Optional[dict | Del "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_external_reference(ext_ref_guid, body, cascade)) + run_sync(self._async_delete_external_reference(ext_ref_guid, body, cascade)) @dynamic_catch async def _async_find_external_references( @@ -1399,8 +1392,7 @@ def find_external_references( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_external_references( search_string=search_string, graph_query_depth=graph_query_depth, @@ -1521,7 +1513,7 @@ def get_external_references_by_name(self, name: Optional[str] = None, classifica PyegeriaException """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_external_references_by_name(name=name, classification_names=classification_names, graph_query_depth=graph_query_depth, body=body, start_from=start_from, page_size=page_size, @@ -1646,7 +1638,7 @@ def get_external_reference_by_guid(self, guid: str, element_type: Optional[str] "forDuplicateProcessing": false } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_external_reference_by_guid(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, @@ -1844,7 +1836,7 @@ def add_external_identifier(self, element_guid: str, The principle specified by the user_id does not have authorization for the requested action """ - return asyncio.get_event_loop().run_until_complete(self._async_add_external_identifier(element_guid, body)) + return run_sync(self._async_add_external_identifier(element_guid, body)) @dynamic_catch async def _async_update_external_identifier(self, external_id_guid: str, @@ -1933,7 +1925,7 @@ def update_external_identifier(self, external_id_guid: str, The principle specified by the user_id does not have authorization for the requested action """ - return asyncio.get_event_loop().run_until_complete(self._async_update_external_identifier(external_id_guid, body)) + return run_sync(self._async_update_external_identifier(external_id_guid, body)) @dynamic_catch async def _async_delete_external_identifier(self, external_id_guid: str, @@ -2005,7 +1997,7 @@ def delete_external_identifier(self, external_id_guid: str, The principle specified by the user_id does not have authorization for the requested action """ - return asyncio.get_event_loop().run_until_complete(self._async_delete_external_identifier(external_id_guid, body)) + return run_sync(self._async_delete_external_identifier(external_id_guid, body)) @dynamic_catch async def _async_confirm_synchronization(self, external_id_link_guid: str, @@ -2076,7 +2068,7 @@ def confirm_synchronization(self, external_id_link_guid: str, The principle specified by the user_id does not have authorization for the requested action """ - return asyncio.get_event_loop().run_until_complete(self._async_confirm_synchronization(external_id_link_guid, body)) + return run_sync(self._async_confirm_synchronization(external_id_link_guid, body)) @dynamic_catch async def _async_get_external_identifiers_by_name(self, name: str = "*", @@ -2177,7 +2169,7 @@ def get_external_identifiers_by_name(self, name: str = "*", Any - list of matching metadata elements or formatted output """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_external_identifiers_by_name(name, body, start_from, page_size, output_format, report_spec, **kwargs)) @dynamic_catch @@ -2302,7 +2294,7 @@ def find_external_identifiers(self, search_string: str = "*", Any - list of matching metadata elements or formatted output """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_find_external_identifiers(search_string, body, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, **kwargs)) @@ -2384,7 +2376,7 @@ def get_external_identifiers_by_guid(self, guid: str, Any - the matching metadata element or formatted output """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_external_identifiers_by_guid(guid, body, output_format, report_spec, **kwargs)) def _extract_external_identifier_properties(self, element: dict, columns_struct: dict) -> dict: @@ -2464,8 +2456,7 @@ async def _async_link_external_id_to_element(self, element_guid: str, external_i def link_external_id_to_element(self, element_guid: str, external_id_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach an external identifier to the element it identifies (ExternalIdLink relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_external_id_to_element(element_guid, external_id_guid, body)) + run_sync(self._async_link_external_id_to_element(element_guid, external_id_guid, body)) @dynamic_catch async def _async_detach_external_id_from_element(self, element_guid: str, external_id_guid: str, @@ -2479,8 +2470,7 @@ async def _async_detach_external_id_from_element(self, element_guid: str, extern def detach_external_id_from_element(self, element_guid: str, external_id_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach an external identifier from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_external_id_from_element(element_guid, external_id_guid, body)) + run_sync(self._async_detach_external_id_from_element(element_guid, external_id_guid, body)) @dynamic_catch async def _async_update_cited_document_reference(self, cited_document_link_relationship_guid: str, @@ -2494,8 +2484,7 @@ async def _async_update_cited_document_reference(self, cited_document_link_relat def update_cited_document_reference(self, cited_document_link_relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of a CitedDocumentLink relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_cited_document_reference(cited_document_link_relationship_guid, body)) + run_sync(self._async_update_cited_document_reference(cited_document_link_relationship_guid, body)) @dynamic_catch async def _async_detach_cited_document_reference_by_id(self, cited_document_link_relationship_guid: str, @@ -2509,8 +2498,7 @@ async def _async_detach_cited_document_reference_by_id(self, cited_document_link def detach_cited_document_reference_by_id(self, cited_document_link_relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach one specific CitedDocumentLink relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_cited_document_reference_by_id(cited_document_link_relationship_guid, body)) + run_sync(self._async_detach_cited_document_reference_by_id(cited_document_link_relationship_guid, body)) @dynamic_catch async def _async_update_external_reference_link(self, external_reference_link_relationship_guid: str, @@ -2524,8 +2512,7 @@ async def _async_update_external_reference_link(self, external_reference_link_re def update_external_reference_link(self, external_reference_link_relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of an ExternalReferenceLink relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_external_reference_link(external_reference_link_relationship_guid, body)) + run_sync(self._async_update_external_reference_link(external_reference_link_relationship_guid, body)) @dynamic_catch async def _async_detach_external_reference_by_id(self, external_reference_link_relationship_guid: str, @@ -2539,8 +2526,7 @@ async def _async_detach_external_reference_by_id(self, external_reference_link_r def detach_external_reference_by_id(self, external_reference_link_relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach one specific ExternalReferenceLink relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_external_reference_by_id(external_reference_link_relationship_guid, body)) + run_sync(self._async_detach_external_reference_by_id(external_reference_link_relationship_guid, body)) @dynamic_catch async def _async_update_media_reference(self, media_reference_relationship_guid: str, @@ -2554,8 +2540,7 @@ async def _async_update_media_reference(self, media_reference_relationship_guid: def update_media_reference(self, media_reference_relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of a MediaReference relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_media_reference(media_reference_relationship_guid, body)) + run_sync(self._async_update_media_reference(media_reference_relationship_guid, body)) @dynamic_catch async def _async_detach_media_reference_by_id(self, media_reference_relationship_guid: str, @@ -2569,8 +2554,7 @@ async def _async_detach_media_reference_by_id(self, media_reference_relationship def detach_media_reference_by_id(self, media_reference_relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach one specific MediaReference relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_media_reference_by_id(media_reference_relationship_guid, body)) + run_sync(self._async_detach_media_reference_by_id(media_reference_relationship_guid, body)) from typing import Union, Dict, List, Optional diff --git a/pyegeria/omvs/glossary_manager.py b/pyegeria/omvs/glossary_manager.py index 678bde28..44bf3f22 100644 --- a/pyegeria/omvs/glossary_manager.py +++ b/pyegeria/omvs/glossary_manager.py @@ -27,6 +27,7 @@ from pyegeria.view.output_formatter import (_extract_referenceable_properties, populate_common_columns, overlay_additional_values, resolve_output_formats) from pyegeria.core.utils import body_slimmer, dynamic_catch +from pyegeria.core.async_runner import run_sync class GlossaryProperties(ReferenceableProperties): class_: Annotated[Literal["GlossaryProperties"], Field(alias="class")] @@ -187,8 +188,7 @@ def create_glossary(self, display_name: str, description: Optional[str] = None, PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_glossary(display_name, description, language, usage, category, body) ) return response @@ -232,8 +232,7 @@ def delete_glossary(self, glossary_guid: str, body: Optional[dict | DeleteElemen None """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_glossary(glossary_guid, body, cascade)) + run_sync(self._async_delete_glossary(glossary_guid, body, cascade)) @dynamic_catch async def _async_update_glossary( @@ -300,8 +299,7 @@ def update_glossary( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_glossary( glossary_guid, body, merge_update @@ -396,8 +394,7 @@ def set_glossary_as_taxonomy(self, glossary_guid: str, organizing_principle: Opt } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_glossary_as_taxonomy(glossary_guid, organizing_principle, body)) + run_sync(self._async_set_glossary_as_taxonomy(glossary_guid, organizing_principle, body)) @dynamic_catch async def _async_clear_glossary_as_taxonomy(self, glossary_guid: str, @@ -466,8 +463,7 @@ def clear_glossary_as_taxonomy(self, glossary_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_glossary_as_taxonomy(glossary_guid, body)) + run_sync(self._async_clear_glossary_as_taxonomy(glossary_guid, body)) @dynamic_catch async def _async_set_glossary_as_canonical(self, glossary_guid: str, scope: Optional[str] = None, @@ -552,8 +548,7 @@ def set_glossary_as_canonical(self, glossary_guid: str, scope: Optional[str] = N } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_glossary_as_canonical(glossary_guid, scope, body)) + run_sync(self._async_set_glossary_as_canonical(glossary_guid, scope, body)) @dynamic_catch async def _async_clear_glossary_as_canonical(self, glossary_guid: str, @@ -622,8 +617,7 @@ def clear_glossary_as_canonical(self, glossary_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_glossary_as_canonical(glossary_guid, body)) + run_sync(self._async_clear_glossary_as_canonical(glossary_guid, body)) @dynamic_catch async def _async_set_glossary_as_naming_standards_vocabulary(self, glossary_guid: str, @@ -705,8 +699,7 @@ def set_glossary_as_naming_standards_vocabulary(self, glossary_guid: str, } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_glossary_as_naming_standards_vocabulary(glossary_guid, body)) + run_sync(self._async_set_glossary_as_naming_standards_vocabulary(glossary_guid, body)) @dynamic_catch async def _async_clear_glossary_as_naming_standards_vocabulary(self, glossary_guid: str, @@ -775,8 +768,7 @@ def clear_glossary_as_naming_standards_vocabulary(self, glossary_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_glossary_as_naming_standards_vocabulary(glossary_guid, body)) + run_sync(self._async_clear_glossary_as_naming_standards_vocabulary(glossary_guid, body)) # # Terms @@ -827,8 +819,7 @@ def create_glossary_term(self, body: dict | NewElementRequestBody) -> str: PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_glossary_term(body) ) @@ -1113,8 +1104,7 @@ def import_glossary_terms_from_csv( The file path is relative to the caller, not the Egeria platform. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_import_glossary_terms_from_csv( glossary_name, filename, file_path, upsert, verbose ) @@ -1272,8 +1262,7 @@ def export_glossary_to_csv( :meth:`import_glossary_terms_from_csv` so a round-trip export → edit → import is straightforward. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_export_glossary_to_csv(glossary_guid, target_file, file_path) ) @@ -1402,8 +1391,7 @@ def create_term_copy( ----- """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_create_term_copy( glossary_guid, glossary_term_guid, @@ -1506,8 +1494,7 @@ def update_glossary_term( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_glossary_term( glossary_term_guid, body, @@ -1622,8 +1609,7 @@ def update_glossary_term_from_template(self, glossary_term_guid: str, template_g } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_glossary_term_from_template( + run_sync(self._async_update_glossary_term_from_template( glossary_term_guid, template_guid, body, merge_update, merge_classifications)) @dynamic_catch @@ -1710,8 +1696,7 @@ def update_glossary_term_status( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_glossary_term_status( glossary_term_guid, term_status, @@ -1795,8 +1780,7 @@ def delete_term( Notes ----- """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_delete_term(term_guid, cascade, body) ) @@ -1870,8 +1854,7 @@ def move_term( Notes ----- """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_move_term(term_guid, glossary_guid, body) ) @@ -1981,8 +1964,7 @@ def add_is_abstract_concept( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_is_abstract_concept(term_guid, body) ) @@ -2071,8 +2053,7 @@ def remove_is_abstract_concept( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_is_abstract_concept(term_guid, body) ) @@ -2173,8 +2154,7 @@ def add_is_context_definition( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_is_context_definition(term_guid, body) ) @@ -2262,8 +2242,7 @@ def remove_is_context_definition( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_is_context_definition(term_guid, body) ) @@ -2360,8 +2339,7 @@ def add_is_data_value( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_is_data_value(term_guid, body) ) @@ -2450,8 +2428,7 @@ def remove_is_data_value( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_is_data_value(term_guid, body) ) @@ -2554,8 +2531,7 @@ def add_activity_description( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_activity_description(term_guid, activity_type, body) ) @@ -2644,8 +2620,7 @@ def remove_activity_description( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_activity_description(term_guid, body) ) @@ -2725,8 +2700,7 @@ def set_term_as_question(self, term_guid: str, } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_term_as_question(term_guid, body)) + run_sync(self._async_set_term_as_question(term_guid, body)) @dynamic_catch async def _async_clear_term_as_question(self, term_guid: str, @@ -2795,8 +2769,7 @@ def clear_term_as_question(self, term_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_term_as_question(term_guid, body)) + run_sync(self._async_clear_term_as_question(term_guid, body)) @dynamic_catch async def _async_create_question(self, display_name: Optional[str] = None, @@ -2866,8 +2839,7 @@ def create_question(self, display_name: Optional[str] = None, ------- str - guid of the created question term """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_question(display_name, description, body)) + return run_sync(self._async_create_question(display_name, description, body)) # # Term - Term Relationships @@ -2997,8 +2969,7 @@ def add_relationship_between_terms( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_relationship_between_terms(term1_guid, term2_guid, relationship_type, body) ) @@ -3122,8 +3093,7 @@ def update_relationship_between_terms( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_relationship_between_terms(term1_guid, term2_guid, relationship_type, body) ) @@ -3207,8 +3177,7 @@ def remove_relationship_between_terms( The principle specified by the user_id does not have authorization for the requested action. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_relationship_between_terms(term1_guid, term2_guid, relationship_type, body) ) @@ -3389,8 +3358,7 @@ async def _async_get_glossary_term_statuses(self) -> [str]: @dynamic_catch def get_glossary_term_statuses(self) -> [str]: - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_glossary_term_statuses()) + response = run_sync(self._async_get_glossary_term_statuses()) return response @dynamic_catch @@ -3402,8 +3370,7 @@ async def _async_get_glossary_term_rel_statuses(self) -> [str]: @dynamic_catch def get_glossary_term_rel_statuses(self) -> [str]: - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_glossary_term_rel_statuses()) + response = run_sync(self._async_get_glossary_term_rel_statuses()) return response @dynamic_catch @@ -3415,8 +3382,7 @@ async def _async_get_glossary_term_activity_types(self) -> [str]: @dynamic_catch def get_glossary_term_activity_types(self) -> [str]: - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_glossary_term_activity_types()) + response = run_sync(self._async_get_glossary_term_activity_types()) return response @dynamic_catch @@ -3428,8 +3394,7 @@ async def _async_get_term_relationship_types(self) -> [str]: @dynamic_catch def get_term_relationship_types(self) -> [str]: - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_term_relationship_types()) + response = run_sync(self._async_get_term_relationship_types()) return response @dynamic_catch @@ -3550,8 +3515,7 @@ def find_glossaries( **kwargs, ) -> list | str: """Retrieve the list of glossary metadata elements that contain the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_glossaries( search_string=search_string, starts_with=starts_with, @@ -3627,8 +3591,7 @@ def get_glossaries_by_name( body: Optional[dict | FilterRequestBody] = None, **kwargs, ) -> dict | str: - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_glossaries_by_name( filter_string=filter_string, classification_names=classification_names, @@ -3685,8 +3648,7 @@ def get_glossary_by_guid( body: Optional[dict | GetRequestBody] = None, **kwargs, ) -> dict | str: - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_glossary_by_guid( glossary_guid=glossary_guid, include_only_relationships=include_only_relationships, @@ -3752,8 +3714,7 @@ def get_terms_by_name( body: Optional[dict | FilterRequestBody] = None, **kwargs, ) -> list | str: - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_terms_by_name( filter_string=filter_string, metadata_element_subtypes=metadata_element_subtypes, @@ -3810,8 +3771,7 @@ def get_term_by_guid( body: Optional[dict | GetRequestBody] = None, **kwargs, ) -> dict | str: - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_term_by_guid( term_guid=term_guid, include_only_relationships=include_only_relationships, @@ -3944,8 +3904,7 @@ def find_glossary_terms( **kwargs, ) -> list | str: """Retrieve the list of glossary term metadata elements that contain the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_glossary_terms( search_string=search_string, starts_with=starts_with, @@ -4021,8 +3980,7 @@ def get_glossary_for_term(self, term_guid: str) -> dict: PyegeriaException If the term is not found, or it is not anchored to any glossary. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_glossary_for_term(term_guid)) + return run_sync(self._async_get_glossary_for_term(term_guid)) # # Naming standards classifications (0438) -- Egeria PR #9166. Simple marker @@ -4067,8 +4025,7 @@ async def _async_set_is_prime_word(self, term_guid: str, def set_is_prime_word(self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a glossary term as a prime word in a naming standard.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_is_prime_word(term_guid, body)) + run_sync(self._async_set_is_prime_word(term_guid, body)) @dynamic_catch async def _async_clear_is_prime_word(self, term_guid: str, @@ -4093,8 +4050,7 @@ async def _async_clear_is_prime_word(self, term_guid: str, def clear_is_prime_word(self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the prime word designation from a glossary term.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_is_prime_word(term_guid, body)) + run_sync(self._async_clear_is_prime_word(term_guid, body)) @dynamic_catch async def _async_set_is_modifier(self, term_guid: str, @@ -4121,8 +4077,7 @@ async def _async_set_is_modifier(self, term_guid: str, def set_is_modifier(self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a glossary term as a modifier in a naming standard.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_is_modifier(term_guid, body)) + run_sync(self._async_set_is_modifier(term_guid, body)) @dynamic_catch async def _async_clear_is_modifier(self, term_guid: str, @@ -4147,8 +4102,7 @@ async def _async_clear_is_modifier(self, term_guid: str, def clear_is_modifier(self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the modifier designation from a glossary term.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_is_modifier(term_guid, body)) + run_sync(self._async_clear_is_modifier(term_guid, body)) @dynamic_catch async def _async_set_is_class_word(self, term_guid: str, @@ -4175,8 +4129,7 @@ async def _async_set_is_class_word(self, term_guid: str, def set_is_class_word(self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a glossary term as a class word in a naming standard.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_is_class_word(term_guid, body)) + run_sync(self._async_set_is_class_word(term_guid, body)) @dynamic_catch async def _async_clear_is_class_word(self, term_guid: str, @@ -4201,8 +4154,7 @@ async def _async_clear_is_class_word(self, term_guid: str, def clear_is_class_word(self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the class word designation from a glossary term.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_is_class_word(term_guid, body)) + run_sync(self._async_clear_is_class_word(term_guid, body)) # @@ -4226,8 +4178,7 @@ async def _async_link_used_in_context(self, glossary_term_guid: str, context_ele def link_used_in_context(self, glossary_term_guid: str, context_element_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a glossary term to the element that provides its usage context (UsedInContext relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_used_in_context(glossary_term_guid, context_element_guid, body)) + run_sync(self._async_link_used_in_context(glossary_term_guid, context_element_guid, body)) @dynamic_catch async def _async_detach_used_in_context(self, glossary_term_guid: str, context_element_guid: str, @@ -4241,8 +4192,7 @@ async def _async_detach_used_in_context(self, glossary_term_guid: str, context_e def detach_used_in_context(self, glossary_term_guid: str, context_element_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a glossary term from its usage context element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_used_in_context(glossary_term_guid, context_element_guid, body)) + run_sync(self._async_detach_used_in_context(glossary_term_guid, context_element_guid, body)) @dynamic_catch async def _async_set_term_as_element_supplement(self, glossary_term_guid: str, @@ -4258,8 +4208,7 @@ async def _async_set_term_as_element_supplement(self, glossary_term_guid: str, def set_term_as_element_supplement(self, glossary_term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a glossary term as a supplement (additional description) for another element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_term_as_element_supplement(glossary_term_guid, body)) + run_sync(self._async_set_term_as_element_supplement(glossary_term_guid, body)) @dynamic_catch async def _async_clear_term_as_element_supplement(self, glossary_term_guid: str, @@ -4273,8 +4222,7 @@ async def _async_clear_term_as_element_supplement(self, glossary_term_guid: str, def clear_term_as_element_supplement(self, glossary_term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the ElementSupplement classification from a glossary term.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_term_as_element_supplement(glossary_term_guid, body)) + run_sync(self._async_clear_term_as_element_supplement(glossary_term_guid, body)) if __name__ == "__main__": diff --git a/pyegeria/omvs/governance_engine.py b/pyegeria/omvs/governance_engine.py index a6100006..2c6949ac 100644 --- a/pyegeria/omvs/governance_engine.py +++ b/pyegeria/omvs/governance_engine.py @@ -18,6 +18,7 @@ from pyegeria.core._server_client import ServerClient from pyegeria.core._validators import validate_guid from pyegeria.core.utils import body_slimmer, dynamic_catch +from pyegeria.core.async_runner import run_sync class GovernanceEngine(ServerClient): @@ -123,8 +124,7 @@ async def _async_get_approved_engine_actions( def get_approved_engine_actions( self, governance_engine_guid: str, start_from: int = 0, page_size: int = 0) -> list | str: """Retrieve the engine actions approved to run on a governance engine that no engine has claimed yet.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_approved_engine_actions(governance_engine_guid, start_from, page_size)) @dynamic_catch @@ -138,8 +138,7 @@ async def _async_claim_engine_action(self, engine_action_guid: str) -> None: def claim_engine_action(self, engine_action_guid: str) -> None: """Request that execution of an engine action is allocated to the caller.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_claim_engine_action(engine_action_guid)) + run_sync(self._async_claim_engine_action(engine_action_guid)) @dynamic_catch async def _async_get_active_claimed_engine_actions( @@ -159,8 +158,7 @@ async def _async_get_active_claimed_engine_actions( def get_active_claimed_engine_actions( self, governance_engine_guid: str, start_from: int = 0, page_size: int = 0) -> list | str: """Retrieve the engine actions still in process that this caller's userId has claimed.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_active_claimed_engine_actions(governance_engine_guid, start_from, page_size)) @dynamic_catch @@ -184,8 +182,7 @@ async def _async_update_engine_action_status(self, engine_action_guid: str, stat def update_engine_action_status(self, engine_action_guid: str, status: str, body: Optional[dict] = None) -> None: """Update the status of the engine action - providing the caller is permitted.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_engine_action_status(engine_action_guid, status, body)) + run_sync(self._async_update_engine_action_status(engine_action_guid, status, body)) @dynamic_catch async def _async_update_action_target_status( @@ -214,8 +211,7 @@ def update_action_target_status( start_date: Optional[str] = None, completion_date: Optional[str] = None, completion_message: Optional[str] = None, body: Optional[dict] = None) -> None: """Update the status of a specific action target.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_action_target_status( + run_sync(self._async_update_action_target_status( action_target_guid, status, start_date, completion_date, completion_message, body)) @dynamic_catch @@ -250,7 +246,6 @@ def record_completion_status( new_action_targets: Optional[list[dict]] = None, completion_message: Optional[str] = None, body: Optional[dict] = None) -> None: """Declare that all processing for the engine action is finished, and the status of the work.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_record_completion_status( + run_sync(self._async_record_completion_status( engine_action_guid, status, request_parameters, output_guards, new_action_targets, completion_message, body)) diff --git a/pyegeria/omvs/governance_officer.py b/pyegeria/omvs/governance_officer.py index e654c9c1..420075a4 100644 --- a/pyegeria/omvs/governance_officer.py +++ b/pyegeria/omvs/governance_officer.py @@ -33,6 +33,7 @@ UpdateRelationshipRequestBody, ResultsRequestBody, NewClassificationRequestBody, DeleteClassificationRequestBody) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync # GovernanceDefinitionProperties and every subclass in its @JsonSubTypes tree, from Egeria main # (8de9572c, 2026-10-26). Regenerate from the Java when Egeria adds a type; a hand-kept list missed @@ -558,8 +559,7 @@ def create_governance_definition(self, body: dict | NewElementRequestBody) -> st """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_governance_definition(body)) + response = run_sync(self._async_create_governance_definition(body)) return response @dynamic_catch @@ -728,8 +728,7 @@ def create_data_lens(self, body: dict | NewElementRequestBody) -> str: } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_data_lens(body)) + return run_sync(self._async_create_data_lens(body)) @dynamic_catch async def _async_create_governance_definition_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -893,8 +892,7 @@ def create_governance_definition_from_template(self, body: dict | TemplateReques """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_governance_definition_from_template(body)) + response = run_sync(self._async_create_governance_definition_from_template(body)) return response @dynamic_catch @@ -1021,8 +1019,7 @@ def update_governance_definition(self, guid: str, body: dict | UpdateElementRequ } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_governance_definition(guid, body)) + run_sync(self._async_update_governance_definition(guid, body)) @dynamic_catch async def _async_delete_governance_definition(self, definition_guid: str, @@ -1112,8 +1109,7 @@ def delete_governance_definition(self, definition_guid: str, body: Optional[dict "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_governance_definition(definition_guid, body, cascade)) + run_sync(self._async_delete_governance_definition(definition_guid, body, cascade)) @dynamic_catch async def _async_link_peer_definitions(self, definition_guid1: str, relationship_type: str, definition_guid2: str, @@ -1233,8 +1229,7 @@ def link_peer_definitions(self, definition_guid1: str, relationship_type: str, d } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_peer_definitions(definition_guid1, relationship_type, definition_guid2, body)) @dynamic_catch @@ -1330,8 +1325,7 @@ def detach_peer_definitions(self, definition_guid1: str, relationship_type: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_peer_definitions(definition_guid1, relationship_type, definition_guid2, body)) @dynamic_catch @@ -1454,8 +1448,7 @@ def attach_supporting_definitions(self, definition_guid1: str, relationship_type } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_attach_supporting_definitions(definition_guid1, relationship_type, definition_guid2, body)) @dynamic_catch @@ -1553,8 +1546,7 @@ def detach_supporting_definitions(self, definition_guid1: str, relationship_type "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_supporting_definitions(definition_guid1, relationship_type, definition_guid2, body)) @@ -1649,8 +1641,7 @@ def attach_governed_by_definition(self, element_guid: str, definition_guid: str, "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_attach_governed_by_definition(element_guid, definition_guid, body)) @dynamic_catch @@ -1742,8 +1733,7 @@ def detach_governed_by_definition(self, element_guid: str, definition_guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_governed_by_definition(element_guid, definition_guid, body)) @dynamic_catch @@ -1874,8 +1864,7 @@ def license_element(self, element_guid: str, license_type_guid: str, "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_license_element(element_guid, license_type_guid, body)) @dynamic_catch @@ -2000,8 +1989,7 @@ def certify_element(self, element_guid: str, certification_type_guid: str, "effectiveTime" : "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_certify_element(element_guid, certification_type_guid, body)) @@ -2298,8 +2286,7 @@ def find_governance_definitions( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_governance_definitions( search_string=search_string, graph_query_depth=graph_query_depth, @@ -2391,8 +2378,7 @@ def find_governance_action_processes( **kwargs ) -> list | str: """ Retrieve the list of governance action process metadata elements that contain the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_governance_action_processes( search_string=search_string, body=body, @@ -2455,8 +2441,7 @@ async def _async_link_approved_purpose(self, element_guid: str, data_processing_ def link_approved_purpose(self, element_guid: str, data_processing_purpose_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """ Attach an element to an approved purpose.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_approved_purpose(element_guid, data_processing_purpose_guid, body)) + run_sync(self._async_link_approved_purpose(element_guid, data_processing_purpose_guid, body)) @dynamic_catch async def _async_detach_approved_purpose(self, element_guid: str, data_processing_purpose_guid: str, @@ -2490,8 +2475,7 @@ async def _async_detach_approved_purpose(self, element_guid: str, data_processin def detach_approved_purpose(self, element_guid: str, data_processing_purpose_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """ Detach an element from an approved purpose.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_approved_purpose(element_guid, data_processing_purpose_guid, body)) + run_sync(self._async_detach_approved_purpose(element_guid, data_processing_purpose_guid, body)) @dynamic_catch async def _async_get_governance_definitions_by_name(self, name: Optional[str] = None, @@ -2635,8 +2619,7 @@ def get_governance_definitions_by_name(self, name: Optional[str] = None, classif } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_governance_definitions_by_name(name=name, classification_names=classification_names, body=body, graph_query_depth=graph_query_depth, start_from=start_from, page_size=page_size, output_format=output_format, report_spec=report_spec, @@ -2781,8 +2764,7 @@ def get_governance_definition_by_guid(self, guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_governance_definition_by_guid(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, @@ -2854,8 +2836,7 @@ def get_gov_def_in_context(self, guid: str, REPORT - output markdown with a preamble for a report MERMAID - output mermaid markdown """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_gov_def_in_context(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, @@ -2978,8 +2959,7 @@ def get_governance_action_process_graph(self, guid: str, element_type: Optional[ """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_governance_action_process_graph(guid, element_type, body, + response = run_sync(self._async_get_governance_action_process_graph(guid, element_type, body, output_format, report_spec, **kwargs)) return response @@ -3055,8 +3035,7 @@ def get_governance_action_process( dict | list | str The governance action process. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_governance_action_process( guid, element_type, output_format, report_spec, body, **kwargs ) @@ -3171,8 +3150,7 @@ def link_design_to_implementation(self, design_desc_guid: str, implementation_gu } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_design_to_implementation(design_desc_guid, implementation_guid, body)) + run_sync(self._async_link_design_to_implementation(design_desc_guid, implementation_guid, body)) @dynamic_catch async def _async_detach_design_from_implementation(self, design_desc_guid: str, implementation_guid: str, @@ -3260,8 +3238,7 @@ def detach_design_from_implementation(self, design_desc_guid: str, implementatio "effectiveTime": "2025-06-13T15:13:31.339Z" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_design_from_implementation(design_desc_guid, implementation_guid, body)) @dynamic_catch @@ -3374,8 +3351,7 @@ def link_implementation_resource(self, design_desc_guid: str, implementation_gui } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_implementation_resource(design_desc_guid, implementation_guid, body)) + run_sync(self._async_link_implementation_resource(design_desc_guid, implementation_guid, body)) @dynamic_catch async def _async_detach_implementation_resource(self, design_desc_guid: str, implementation_guid: str, @@ -3465,8 +3441,7 @@ def detach_implementation_resource(self, design_desc_guid: str, implementation_g "effectiveTime": "2025-06-13T15:13:31.339Z" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_implementation_resource(design_desc_guid, implementation_guid, body)) + run_sync(self._async_detach_implementation_resource(design_desc_guid, implementation_guid, body)) @dynamic_catch @@ -3565,8 +3540,7 @@ def link_governance_results(self, gov_metric_guid: str, data_asset_guid: str, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_governance_results(gov_metric_guid, data_asset_guid, body)) + run_sync(self._async_link_governance_results(gov_metric_guid, data_asset_guid, body)) @dynamic_catch async def _async_detach_governance_results(self, gov_metric_guid: str, data_asset_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -3647,8 +3621,7 @@ def detach_governance_results(self, gov_metric_guid: str, data_asset_guid: str, "effectiveTime": "2025-06-13T15:13:31.339Z" } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_governance_results(gov_metric_guid, data_asset_guid, body)) + run_sync(self._async_detach_governance_results(gov_metric_guid, data_asset_guid, body)) @dynamic_catch async def _async_add_regulator_to_regulation(self, regulation_guid: str, regulator_guid, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: @@ -3751,8 +3724,7 @@ def add_regulator_to_regulation(self, regulation_guid: str, regulator_guid, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_regulator_to_regulation(regulation_guid, regulator_guid, body)) + run_sync(self._async_add_regulator_to_regulation(regulation_guid, regulator_guid, body)) @dynamic_catch async def _async_detach_regulator_from_regulation(self, regulation_guid: str, regulator_guid, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -3833,8 +3805,7 @@ def detach_regulator_from_regulation(self, regulation_guid: str, regulator_guid, "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_regulator_from_regulation(regulation_guid, regulator_guid, body)) + run_sync(self._async_detach_regulator_from_regulation(regulation_guid, regulator_guid, body)) @@ -3861,8 +3832,7 @@ async def _async_link_exception(self, element_guid: str, exception_type_guid: st def link_exception(self, element_guid: str, exception_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach an exception to the element it was raised against (Exception relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_exception(element_guid, exception_type_guid, body)) + run_sync(self._async_link_exception(element_guid, exception_type_guid, body)) @dynamic_catch async def _async_update_exception(self, exception_guid: str, @@ -3876,8 +3846,7 @@ async def _async_update_exception(self, exception_guid: str, def update_exception(self, exception_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of an Exception relationship.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_exception(exception_guid, body)) + run_sync(self._async_update_exception(exception_guid, body)) @dynamic_catch async def _async_detach_exception(self, exception_guid: str, @@ -3891,8 +3860,7 @@ async def _async_detach_exception(self, exception_guid: str, def detach_exception(self, exception_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach (delete) an Exception relationship.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_exception(exception_guid, body)) + run_sync(self._async_detach_exception(exception_guid, body)) @dynamic_catch async def _async_link_regulation_certification_type(self, regulation_guid: str, certification_type_guid: str, @@ -3906,8 +3874,7 @@ async def _async_link_regulation_certification_type(self, regulation_guid: str, def link_regulation_certification_type(self, regulation_guid: str, certification_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a certification type that demonstrates compliance with a regulation (RegulationCertificationType relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_regulation_certification_type(regulation_guid, certification_type_guid, body)) + run_sync(self._async_link_regulation_certification_type(regulation_guid, certification_type_guid, body)) @dynamic_catch async def _async_detach_regulation_certification_type(self, regulation_guid: str, certification_type_guid: str, @@ -3921,8 +3888,7 @@ async def _async_detach_regulation_certification_type(self, regulation_guid: str def detach_regulation_certification_type(self, regulation_guid: str, certification_type_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a certification type from a regulation.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_regulation_certification_type(regulation_guid, certification_type_guid, body)) + run_sync(self._async_detach_regulation_certification_type(regulation_guid, certification_type_guid, body)) @dynamic_catch async def _async_set_control_point(self, element_guid: str, @@ -3938,8 +3904,7 @@ async def _async_set_control_point(self, element_guid: str, def set_control_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a ControlPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_control_point(element_guid, body)) + run_sync(self._async_set_control_point(element_guid, body)) @dynamic_catch async def _async_clear_control_point(self, element_guid: str, @@ -3953,8 +3918,7 @@ async def _async_clear_control_point(self, element_guid: str, def clear_control_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the ControlPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_control_point(element_guid, body)) + run_sync(self._async_clear_control_point(element_guid, body)) @dynamic_catch async def _async_set_verification_point(self, element_guid: str, @@ -3970,8 +3934,7 @@ async def _async_set_verification_point(self, element_guid: str, def set_verification_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a VerificationPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_verification_point(element_guid, body)) + run_sync(self._async_set_verification_point(element_guid, body)) @dynamic_catch async def _async_clear_verification_point(self, element_guid: str, @@ -3985,8 +3948,7 @@ async def _async_clear_verification_point(self, element_guid: str, def clear_verification_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the VerificationPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_verification_point(element_guid, body)) + run_sync(self._async_clear_verification_point(element_guid, body)) @dynamic_catch async def _async_set_enforcement_point(self, element_guid: str, @@ -4002,8 +3964,7 @@ async def _async_set_enforcement_point(self, element_guid: str, def set_enforcement_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a EnforcementPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_enforcement_point(element_guid, body)) + run_sync(self._async_set_enforcement_point(element_guid, body)) @dynamic_catch async def _async_clear_enforcement_point(self, element_guid: str, @@ -4017,8 +3978,7 @@ async def _async_clear_enforcement_point(self, element_guid: str, def clear_enforcement_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the EnforcementPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_enforcement_point(element_guid, body)) + run_sync(self._async_clear_enforcement_point(element_guid, body)) @dynamic_catch async def _async_set_execution_point(self, element_guid: str, @@ -4034,8 +3994,7 @@ async def _async_set_execution_point(self, element_guid: str, def set_execution_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a ExecutionPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_execution_point(element_guid, body)) + run_sync(self._async_set_execution_point(element_guid, body)) @dynamic_catch async def _async_clear_execution_point(self, element_guid: str, @@ -4049,8 +4008,7 @@ async def _async_clear_execution_point(self, element_guid: str, def clear_execution_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the ExecutionPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_execution_point(element_guid, body)) + run_sync(self._async_clear_execution_point(element_guid, body)) @dynamic_catch async def _async_set_policy_administration_point(self, element_guid: str, @@ -4066,8 +4024,7 @@ async def _async_set_policy_administration_point(self, element_guid: str, def set_policy_administration_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a PolicyAdministrationPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_policy_administration_point(element_guid, body)) + run_sync(self._async_set_policy_administration_point(element_guid, body)) @dynamic_catch async def _async_clear_policy_administration_point(self, element_guid: str, @@ -4081,8 +4038,7 @@ async def _async_clear_policy_administration_point(self, element_guid: str, def clear_policy_administration_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the PolicyAdministrationPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_policy_administration_point(element_guid, body)) + run_sync(self._async_clear_policy_administration_point(element_guid, body)) @dynamic_catch async def _async_set_policy_decision_point(self, element_guid: str, @@ -4098,8 +4054,7 @@ async def _async_set_policy_decision_point(self, element_guid: str, def set_policy_decision_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a PolicyDecisionPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_policy_decision_point(element_guid, body)) + run_sync(self._async_set_policy_decision_point(element_guid, body)) @dynamic_catch async def _async_clear_policy_decision_point(self, element_guid: str, @@ -4113,8 +4068,7 @@ async def _async_clear_policy_decision_point(self, element_guid: str, def clear_policy_decision_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the PolicyDecisionPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_policy_decision_point(element_guid, body)) + run_sync(self._async_clear_policy_decision_point(element_guid, body)) @dynamic_catch async def _async_set_policy_enforcement_point(self, element_guid: str, @@ -4130,8 +4084,7 @@ async def _async_set_policy_enforcement_point(self, element_guid: str, def set_policy_enforcement_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a PolicyEnforcementPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_policy_enforcement_point(element_guid, body)) + run_sync(self._async_set_policy_enforcement_point(element_guid, body)) @dynamic_catch async def _async_clear_policy_enforcement_point(self, element_guid: str, @@ -4145,8 +4098,7 @@ async def _async_clear_policy_enforcement_point(self, element_guid: str, def clear_policy_enforcement_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the PolicyEnforcementPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_policy_enforcement_point(element_guid, body)) + run_sync(self._async_clear_policy_enforcement_point(element_guid, body)) @dynamic_catch async def _async_set_policy_information_point(self, element_guid: str, @@ -4162,8 +4114,7 @@ async def _async_set_policy_information_point(self, element_guid: str, def set_policy_information_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a PolicyInformationPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_policy_information_point(element_guid, body)) + run_sync(self._async_set_policy_information_point(element_guid, body)) @dynamic_catch async def _async_clear_policy_information_point(self, element_guid: str, @@ -4177,8 +4128,7 @@ async def _async_clear_policy_information_point(self, element_guid: str, def clear_policy_information_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the PolicyInformationPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_policy_information_point(element_guid, body)) + run_sync(self._async_clear_policy_information_point(element_guid, body)) @dynamic_catch async def _async_set_policy_management_point(self, element_guid: str, @@ -4194,8 +4144,7 @@ async def _async_set_policy_management_point(self, element_guid: str, def set_policy_management_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a PolicyManagementPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_policy_management_point(element_guid, body)) + run_sync(self._async_set_policy_management_point(element_guid, body)) @dynamic_catch async def _async_clear_policy_management_point(self, element_guid: str, @@ -4209,8 +4158,7 @@ async def _async_clear_policy_management_point(self, element_guid: str, def clear_policy_management_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the PolicyManagementPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_policy_management_point(element_guid, body)) + run_sync(self._async_clear_policy_management_point(element_guid, body)) @dynamic_catch async def _async_set_policy_retrieval_point(self, element_guid: str, @@ -4226,8 +4174,7 @@ async def _async_set_policy_retrieval_point(self, element_guid: str, def set_policy_retrieval_point(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as a PolicyRetrievalPoint.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_policy_retrieval_point(element_guid, body)) + run_sync(self._async_set_policy_retrieval_point(element_guid, body)) @dynamic_catch async def _async_clear_policy_retrieval_point(self, element_guid: str, @@ -4241,8 +4188,7 @@ async def _async_clear_policy_retrieval_point(self, element_guid: str, def clear_policy_retrieval_point(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the PolicyRetrievalPoint classification from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_policy_retrieval_point(element_guid, body)) + run_sync(self._async_clear_policy_retrieval_point(element_guid, body)) if __name__ == "__main__": diff --git a/pyegeria/omvs/lineage_linker.py b/pyegeria/omvs/lineage_linker.py index f82cb1bf..02bfcf93 100644 --- a/pyegeria/omvs/lineage_linker.py +++ b/pyegeria/omvs/lineage_linker.py @@ -18,6 +18,7 @@ DeleteRelationshipRequestBody, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync # Field set mirrors the real Java DTO inheritance chain (confirmed against @@ -256,8 +257,7 @@ def link_lineage( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_lineage(element_one_guid, relationship_type_name, element_two_guid, body) ) @@ -358,8 +358,7 @@ def link_data_flow( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_data_flow(element_one_guid, relationship_type_name, element_two_guid, body) ) @@ -453,8 +452,7 @@ def update_lineage( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_lineage(lineage_relationship_guid, body)) + return run_sync(self._async_update_lineage(lineage_relationship_guid, body)) @dynamic_catch async def _async_detach_lineage( @@ -542,7 +540,6 @@ def detach_lineage( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_detach_lineage(lineage_relationship_guid, body, cascade_delete=cascade_delete) ) diff --git a/pyegeria/omvs/location_arena.py b/pyegeria/omvs/location_arena.py index 59ee274c..486697e0 100644 --- a/pyegeria/omvs/location_arena.py +++ b/pyegeria/omvs/location_arena.py @@ -20,6 +20,7 @@ _extract_referenceable_properties, get_required_relationships from pyegeria.core.utils import dynamic_catch from loguru import logger +from pyegeria.core.async_runner import run_sync class LocationArena(ServerClient): @@ -142,7 +143,7 @@ def create_location(self, body: Optional[dict | NewElementRequestBody] = None) - } ``` """ - return asyncio.get_event_loop().run_until_complete(self._async_create_location(body)) + return run_sync(self._async_create_location(body)) ####### @@ -257,8 +258,7 @@ def create_location_from_template(self, body: Optional[dict | TemplateRequestBod } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_location_from_template(body)) + resp = run_sync(self._async_create_location_from_template(body)) return resp @dynamic_catch @@ -331,7 +331,7 @@ def update_location(self, location_guid: str, body: dict | UpdateElementRequestB } ``` """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_update_location(location_guid, body)) @dynamic_catch @@ -412,8 +412,7 @@ def link_peer_locations(self, location1_guid: str, location2_guid: str, } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_peer_locations(location1_guid, location2_guid, body)) + run_sync(self._async_link_peer_locations(location1_guid, location2_guid, body)) @dynamic_catch async def _async_detach_peer_locations(self, location1_guid: str, location2_guid: str, @@ -499,8 +498,7 @@ def detach_peer_locations(self, location1_guid: str, location2_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_peer_locations(location1_guid, location2_guid, body)) + run_sync(self._async_detach_peer_locations(location1_guid, location2_guid, body)) @dynamic_catch async def _async_link_nested_location(self, location_guid: str, nested_location_guid: str, @@ -602,8 +600,7 @@ def link_nested_location(self, location_guid: str, nested_location_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_nested_location(location_guid, nested_location_guid, body)) + run_sync(self._async_link_nested_location(location_guid, nested_location_guid, body)) @dynamic_catch async def _async_detach_nested_location(self, location_guid: str, nested_location_guid: str, @@ -690,8 +687,7 @@ def detach_nested_location(self, location_guid: str, nested_location_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_nested_location(location_guid, nested_location_guid, body)) + run_sync(self._async_detach_nested_location(location_guid, nested_location_guid, body)) @dynamic_catch async def _async_link_known_location(self, element_guid: str, location_guid: str, @@ -794,8 +790,7 @@ def link_known_location(self, element_guid: str, location_guid: str, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_known_location(element_guid, location_guid, body)) + run_sync(self._async_link_known_location(element_guid, location_guid, body)) @dynamic_catch async def _async_detach_known_location(self, element_guid: str, location_guid: str, @@ -881,8 +876,7 @@ def detach_known_location(self, element_guid: str, location_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_known_location(element_guid, location_guid, body)) + run_sync(self._async_detach_known_location(element_guid, location_guid, body)) @dynamic_catch async def _async_delete_location(self, location_guid: str, @@ -956,8 +950,7 @@ def delete_location(self, location_guid: str, body: Optional[dict | DeleteElemen } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_location(location_guid, body, cascade)) + run_sync(self._async_delete_location(location_guid, body, cascade)) @dynamic_catch async def _async_find_locations( @@ -1120,8 +1113,7 @@ def find_locations( ------- List | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_locations( search_string=search_string, starts_with=starts_with, @@ -1282,8 +1274,7 @@ def get_locations_by_name( if name is None and body is None: name = "*" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_locations_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -1389,8 +1380,7 @@ def get_location_by_guid( ------- dict | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_location_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -1506,8 +1496,7 @@ async def _async_set_location_as_fixed_location(self, location_guid: str, def set_location_as_fixed_location(self, location_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a location as a fixed physical location.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_location_as_fixed_location(location_guid, body)) + run_sync(self._async_set_location_as_fixed_location(location_guid, body)) @dynamic_catch async def _async_clear_location_as_fixed_location(self, location_guid: str, @@ -1521,8 +1510,7 @@ async def _async_clear_location_as_fixed_location(self, location_guid: str, def clear_location_as_fixed_location(self, location_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the FixedLocation classification from a location.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_location_as_fixed_location(location_guid, body)) + run_sync(self._async_clear_location_as_fixed_location(location_guid, body)) @dynamic_catch async def _async_set_location_as_cyber_location(self, location_guid: str, @@ -1538,8 +1526,7 @@ async def _async_set_location_as_cyber_location(self, location_guid: str, def set_location_as_cyber_location(self, location_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a location as a cyber (network) location.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_location_as_cyber_location(location_guid, body)) + run_sync(self._async_set_location_as_cyber_location(location_guid, body)) @dynamic_catch async def _async_clear_location_as_cyber_location(self, location_guid: str, @@ -1553,8 +1540,7 @@ async def _async_clear_location_as_cyber_location(self, location_guid: str, def clear_location_as_cyber_location(self, location_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the CyberLocation classification from a location.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_location_as_cyber_location(location_guid, body)) + run_sync(self._async_clear_location_as_cyber_location(location_guid, body)) @dynamic_catch async def _async_set_location_as_secure_location(self, location_guid: str, @@ -1570,8 +1556,7 @@ async def _async_set_location_as_secure_location(self, location_guid: str, def set_location_as_secure_location(self, location_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a location as a secure location.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_location_as_secure_location(location_guid, body)) + run_sync(self._async_set_location_as_secure_location(location_guid, body)) @dynamic_catch async def _async_clear_location_as_secure_location(self, location_guid: str, @@ -1585,5 +1570,4 @@ async def _async_clear_location_as_secure_location(self, location_guid: str, def clear_location_as_secure_location(self, location_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the SecureLocation classification from a location.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_location_as_secure_location(location_guid, body)) + run_sync(self._async_clear_location_as_secure_location(location_guid, body)) diff --git a/pyegeria/omvs/metadata_expert.py b/pyegeria/omvs/metadata_expert.py index bc013c5b..af410e92 100644 --- a/pyegeria/omvs/metadata_expert.py +++ b/pyegeria/omvs/metadata_expert.py @@ -22,6 +22,7 @@ from pyegeria.core.utils import body_slimmer, dynamic_catch from pyegeria.core._server_client import ServerClient, max_paging_size from pyegeria.core._globals import default_timeout, NO_ELEMENTS_FOUND +from pyegeria.core.async_runner import run_sync def base_path(client: ServerClient, view_server: str): return f"{client.platform_url}/servers/{view_server}/api/open-metadata/metadata-expert" @@ -151,8 +152,7 @@ def create_metadata_element(self, body: Optional[dict | NewOpenMetadataElementRe """ Create a new metadata element in the metadata store. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_metadata_element(body)) + return run_sync(self._async_create_metadata_element(body)) @dynamic_catch @@ -212,8 +212,7 @@ def create_metadata_element_from_template(self, body: Optional[dict | TemplateRe """ Create a new metadata element in the metadata store using a template. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_metadata_element_from_template(body)) + return run_sync(self._async_create_metadata_element_from_template(body)) @dynamic_catch @@ -259,8 +258,7 @@ def update_metadata_element_properties(self, metadata_element_guid: str, body: O """ Update the properties of a specific metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_metadata_element_properties(metadata_element_guid, body)) + return run_sync(self._async_update_metadata_element_properties(metadata_element_guid, body)) @dynamic_catch async def _async_reidentify_metadata_element(self, metadata_element_guid: str, body: Optional[dict | ReIdentifyRequestBody] = None) -> None: @@ -297,8 +295,7 @@ def reidentify_metadata_element(self, metadata_element_guid: str, body: Optional """ Change the unique identifier of a metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_reidentify_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_reidentify_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_retype_metadata_element(self, metadata_element_guid: str, body: Optional[dict | ReTypeRequestBody] = None) -> None: @@ -335,8 +332,7 @@ def retype_metadata_element(self, metadata_element_guid: str, body: Optional[dic """ Change the type of a metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_retype_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_retype_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_rehome_metadata_element(self, metadata_element_guid: str, body: Optional[dict | ReHomeRequestBody] = None) -> None: @@ -374,8 +370,7 @@ def rehome_metadata_element(self, metadata_element_guid: str, body: Optional[dic """ Change the home repository of a metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_rehome_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_rehome_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_publish_metadata_element(self, metadata_element_guid: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -409,8 +404,7 @@ def publish_metadata_element(self, metadata_element_guid: str, body: Optional[di """ Update the zone membership to increase its visibility. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_publish_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_publish_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_withdraw_metadata_element(self, metadata_element_guid: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -444,8 +438,7 @@ def withdraw_metadata_element(self, metadata_element_guid: str, body: Optional[d """ Update the zone membership to decrease its visibility. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_withdraw_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_withdraw_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_update_metadata_element_effectivity(self, metadata_element_guid: str, body: Optional[dict | UpdateEffectivityDatesRequestBody] = None) -> None: @@ -481,8 +474,7 @@ def update_metadata_element_effectivity(self, metadata_element_guid: str, body: """ Update the effectivity dates for a specific metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_metadata_element_effectivity(metadata_element_guid, body)) + return run_sync(self._async_update_metadata_element_effectivity(metadata_element_guid, body)) @dynamic_catch async def _async_delete_metadata_element(self, metadata_element_guid: str, body: Optional[dict | DeleteElementRequestBody] = None, @@ -532,8 +524,7 @@ def delete_metadata_element(self, metadata_element_guid: str, body: Optional[dic """ Delete a specific metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_metadata_element(metadata_element_guid, body, cascade_delete)) + return run_sync(self._async_delete_metadata_element(metadata_element_guid, body, cascade_delete)) @dynamic_catch async def _async_archive_metadata_element(self, metadata_element_guid: str, body: Optional[dict | DeleteElementRequestBody] = None) -> None: @@ -598,8 +589,7 @@ def archive_metadata_element(self, metadata_element_guid: str, body: Optional[di "effectiveTime": "{{$isoTimestamp}}" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_archive_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_archive_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_undo_metadata_element_update(self, metadata_element_guid: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -644,8 +634,7 @@ def undo_metadata_element_update(self, metadata_element_guid: str, body: Optiona body : dict | MetadataSourceRequestBody, optional Request options; see the async version for a sample. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_undo_metadata_element_update(metadata_element_guid, body)) + return run_sync(self._async_undo_metadata_element_update(metadata_element_guid, body)) @dynamic_catch async def _async_restore_metadata_element(self, metadata_element_guid: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -692,8 +681,7 @@ def restore_metadata_element(self, metadata_element_guid: str, body: Optional[di body : dict | MetadataSourceRequestBody, optional Request options; see the async version for a sample. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_restore_metadata_element(metadata_element_guid, body)) + return run_sync(self._async_restore_metadata_element(metadata_element_guid, body)) @dynamic_catch async def _async_classify_metadata_element(self, metadata_element_guid: str, classification_name: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: @@ -729,8 +717,7 @@ def classify_metadata_element(self, metadata_element_guid: str, classification_n """ Add a new classification to the metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_classify_metadata_element(metadata_element_guid, classification_name, body)) + return run_sync(self._async_classify_metadata_element(metadata_element_guid, classification_name, body)) @dynamic_catch async def _async_reclassify_metadata_element(self, metadata_element_guid: str, classification_name: str, body: Optional[dict | UpdatePropertiesRequestBody] = None) -> None: @@ -766,8 +753,7 @@ def reclassify_metadata_element(self, metadata_element_guid: str, classification """ Update the properties of a classification that is currently attached to a specific metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_reclassify_metadata_element(metadata_element_guid, classification_name, body)) + return run_sync(self._async_reclassify_metadata_element(metadata_element_guid, classification_name, body)) @dynamic_catch async def _async_update_classification_effectivity(self, metadata_element_guid: str, classification_name: str, body: Optional[dict | UpdateEffectivityDatesRequestBody] = None) -> None: @@ -805,8 +791,7 @@ def update_classification_effectivity(self, metadata_element_guid: str, classifi """ Update the effectivity dates of a specific classification attached to a metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_classification_effectivity(metadata_element_guid, classification_name, body)) + return run_sync(self._async_update_classification_effectivity(metadata_element_guid, classification_name, body)) @dynamic_catch async def _async_declassify_metadata_element(self, metadata_element_guid: str, classification_name: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -842,8 +827,7 @@ def declassify_metadata_element(self, metadata_element_guid: str, classification """ Remove the named classification from a specific metadata element. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_declassify_metadata_element(metadata_element_guid, classification_name, body)) + return run_sync(self._async_declassify_metadata_element(metadata_element_guid, classification_name, body)) @dynamic_catch async def _async_create_related_elements(self, body: Optional[dict | NewRelatedElementsRequestBody] = None) -> str: @@ -897,8 +881,7 @@ def create_related_elements(self, body: Optional[dict | NewRelatedElementsReques """ Create a relationship between two metadata elements. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_related_elements(body)) + return run_sync(self._async_create_related_elements(body)) @dynamic_catch async def _async_update_related_elements_properties(self, relationship_guid: str, body: Optional[dict | UpdatePropertiesRequestBody] = None) -> None: @@ -932,8 +915,7 @@ def update_related_elements_properties(self, relationship_guid: str, body: Optio """ Update the properties associated with a relationship. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_related_elements_properties(relationship_guid, body)) + return run_sync(self._async_update_related_elements_properties(relationship_guid, body)) @dynamic_catch async def _async_reidentify_related_elements(self, relationship_guid: str, body: Optional[dict | ReIdentifyRequestBody] = None) -> None: @@ -970,8 +952,7 @@ def reidentify_related_elements(self, relationship_guid: str, body: Optional[dic """ Change the unique identifier of a relationship. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_reidentify_related_elements(relationship_guid, body)) + return run_sync(self._async_reidentify_related_elements(relationship_guid, body)) @dynamic_catch async def _async_retype_related_elements(self, relationship_guid: str, body: Optional[dict | ReTypeRequestBody] = None) -> None: @@ -1008,8 +989,7 @@ def retype_related_elements(self, relationship_guid: str, body: Optional[dict | """ Change the type of a relationship. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_retype_related_elements(relationship_guid, body)) + return run_sync(self._async_retype_related_elements(relationship_guid, body)) @dynamic_catch async def _async_rehome_related_elements(self, relationship_guid: str, body: Optional[dict | ReHomeRequestBody] = None) -> None: @@ -1047,8 +1027,7 @@ def rehome_related_elements(self, relationship_guid: str, body: Optional[dict | """ Change the home repository of a relationship. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_rehome_related_elements(relationship_guid, body)) + return run_sync(self._async_rehome_related_elements(relationship_guid, body)) @dynamic_catch async def _async_update_related_elements_effectivity(self, relationship_guid: str, body: Optional[dict | UpdateEffectivityDatesRequestBody] = None) -> None: @@ -1084,8 +1063,7 @@ def update_related_elements_effectivity(self, relationship_guid: str, body: Opti """ Update the effectivity dates of a specific relationship between metadata elements. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_related_elements_effectivity(relationship_guid, body)) + return run_sync(self._async_update_related_elements_effectivity(relationship_guid, body)) @dynamic_catch async def _async_delete_related_elements(self, relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -1131,8 +1109,7 @@ def delete_related_elements(self, relationship_guid: str, body: Optional[dict | """ Delete a relationship between two metadata elements. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_related_elements(relationship_guid, body)) + return run_sync(self._async_delete_related_elements(relationship_guid, body)) @dynamic_catch async def _async_undo_related_elements_update(self, relationship_guid: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -1177,8 +1154,7 @@ def undo_related_elements_update(self, relationship_guid: str, body: Optional[di body : dict | MetadataSourceRequestBody, optional Request options; see the async version for a sample. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_undo_related_elements_update(relationship_guid, body)) + return run_sync(self._async_undo_related_elements_update(relationship_guid, body)) @dynamic_catch async def _async_restore_related_elements(self, relationship_guid: str, body: Optional[dict | MetadataSourceRequestBody] = None) -> None: @@ -1223,8 +1199,7 @@ def restore_related_elements(self, relationship_guid: str, body: Optional[dict | body : dict | MetadataSourceRequestBody, optional Request options; see the async version for a sample. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_restore_related_elements(relationship_guid, body)) + return run_sync(self._async_restore_related_elements(relationship_guid, body)) @dynamic_catch async def _async_detach_related_elements_in_store( @@ -1308,8 +1283,7 @@ def detach_related_elements_in_store( "effectiveTime" : "2024-01-01T00:00:00.000+00:00" } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_detach_related_elements_in_store( metadata_element_1_guid, relationship_type_name, metadata_element_2_guid, body ) @@ -1443,8 +1417,7 @@ def get_metadata_guid_by_unique_name( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_metadata_guid_by_unique_name( name=name, property_name=property_name, as_of_time=as_of_time, body=body, **kwargs ) @@ -1555,8 +1528,7 @@ def get_metadata_element_by_guid( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_metadata_element_by_guid( graph_query_depth=graph_query_depth, output_format=output_format, @@ -1682,8 +1654,7 @@ def get_anchored_element_graph( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_anchored_element_graph( guid=guid, as_of_time=as_of_time, mermaid_only=mermaid_only, body=body, **kwargs ) @@ -1810,8 +1781,7 @@ def get_metadata_element_by_unique_name( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_metadata_element_by_unique_name( name=name, property_name=property_name, body=body, **kwargs ) @@ -1970,8 +1940,7 @@ def get_element_history( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_element_history( guid=guid, oldest_first=oldest_first, from_time=from_time, to_time=to_time, start_from=start_from, page_size=page_size, body=body, **kwargs @@ -2029,8 +1998,7 @@ def get_metadata_element_history( **kwargs, ) -> list | str: """Retrieve the history of a metadata element.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_metadata_element_history(metadata_element_guid, effective_time, oldest_first, body, **kwargs) ) @@ -2195,8 +2163,7 @@ def get_classification_history( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_classification_history( guid=guid, classification_name=classification_name, oldest_first=oldest_first, from_time=from_time, to_time=to_time, start_from=start_from, page_size=page_size, @@ -2370,8 +2337,7 @@ def find_metadata_elements_with_string(self, search_string: str = "*", starts_wi list | str: Returns the search results as a list of metadata elements, or as a string in cases where the output is serialized in text format. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_metadata_elements_with_string( search_string=search_string, starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case, anchor_domain=anchor_domain, zone_filter=zone_filter, @@ -2552,8 +2518,7 @@ def find_elements_for_anchor(self, guid: Optional[str] = None, search_string: st list | str: Returns the search results as a list of metadata elements, or as a string in cases where the output is serialized in text format. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_elements_for_anchor( guid=guid, search_string=search_string, starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case, anchor_domain=anchor_domain, zone_filter=zone_filter, @@ -2733,8 +2698,7 @@ def find_elements_in_anchor_domain(self, search_string: str = "*", starts_with: list | str: Returns the search results as a list of metadata elements, or as a string in cases where the output is serialized in text format. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_elements_in_anchor_domain( search_string=search_string, starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case, anchor_domain=anchor_domain, zone_filter=zone_filter, @@ -2919,8 +2883,7 @@ def find_elements_in_anchor_scope(self, guid: Optional[str] = None, search_strin list | str: Returns the search results as a list of metadata elements, or as a string in cases where the output is serialized in text format. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_elements_in_anchor_scope( guid=guid, search_string=search_string, starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case, anchor_domain=anchor_domain, zone_filter=zone_filter, @@ -3074,8 +3037,7 @@ def get_all_related_elements( "sequencingProperty": "" } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_all_related_elements( guid=guid, starting_at_end=starting_at_end, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, relationships_page_size=relationships_page_size, @@ -3236,8 +3198,7 @@ def get_related_metadata_elements( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_related_metadata_elements( guid, relationship_type, @@ -3410,8 +3371,7 @@ def get_all_metadata_element_relationships( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_all_metadata_element_relationships( end1_guid, end2_guid, @@ -3590,8 +3550,7 @@ def get_metadata_element_relationships( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_metadata_element_relationships( end1_guid, end2_guid, @@ -3855,8 +3814,7 @@ def find_metadata_elements( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_metadata_elements(body, timeout=timeout, **kwargs) ) return response @@ -3965,8 +3923,7 @@ def count_metadata_elements( PyegeriaUnauthorizedException the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_count_metadata_elements(body, push_down=push_down, timeout=timeout, **kwargs) ) @@ -4160,8 +4117,7 @@ def find_relationships_between_elements( } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_relationships_between_elements( body, graph_query_depth=graph_query_depth, @@ -4287,8 +4243,7 @@ def count_relationships_between_elements( PyegeriaUnauthorizedException the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_count_relationships_between_elements(body, push_down=push_down, timeout=timeout, **kwargs) ) @@ -4388,8 +4343,7 @@ def get_relationship_by_guid( the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_relationship_by_guid( guid=guid, as_of_time=as_of_time, @@ -4541,8 +4495,7 @@ def get_relationship_history( the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_relationship_history( guid, oldest_first=oldest_first, @@ -4571,8 +4524,7 @@ async def _async_get_match_criteria_list(self) -> list: @dynamic_catch def get_match_criteria_list(self) -> list: """Retrieve the list of valid match criteria.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_match_criteria_list()) + return run_sync(self._async_get_match_criteria_list()) @dynamic_catch async def _async_get_property_comparison_operator_list(self) -> list: @@ -4584,8 +4536,7 @@ async def _async_get_property_comparison_operator_list(self) -> list: @dynamic_catch def get_property_comparison_operator_list(self) -> list: """Retrieve the list of valid property comparison operators.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_property_comparison_operator_list()) + return run_sync(self._async_get_property_comparison_operator_list()) # # Maintain the open metadata types that are defined through the API. These are validated against the types @@ -4650,8 +4601,7 @@ async def _async_add_enum_def(self, body: dict | OpenMetadataEnumDef) -> str | d def add_enum_def(self, body: dict | OpenMetadataEnumDef) -> str | dict: """Add a new enum definition, which can then be used as the type of attributes in new type definitions. Note: it cannot be removed again through the API (ISSUE-125); see the async version's warning.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_add_enum_def(body)) + return run_sync(self._async_add_enum_def(body)) @dynamic_catch async def _async_add_type_def(self, body: dict | OpenMetadataTypeDef) -> str | dict: @@ -4698,8 +4648,7 @@ async def _async_add_type_def(self, body: dict | OpenMetadataTypeDef) -> str | d @dynamic_catch def add_type_def(self, body: dict | OpenMetadataTypeDef) -> str | dict: """Add a new type definition for an entity, relationship or classification.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_add_type_def(body)) + return run_sync(self._async_add_type_def(body)) @dynamic_catch async def _async_update_type_def(self, body: dict | OpenMetadataTypeDefPatch) -> None: @@ -4740,8 +4689,7 @@ async def _async_update_type_def(self, body: dict | OpenMetadataTypeDefPatch) -> @dynamic_catch def update_type_def(self, body: dict | OpenMetadataTypeDefPatch) -> None: """Update a type definition that was added through the API.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_type_def(body)) + return run_sync(self._async_update_type_def(body)) @dynamic_catch async def _async_delete_type_def(self, type_def_guid: str, type_def_name: str) -> None: @@ -4762,8 +4710,7 @@ async def _async_delete_type_def(self, type_def_guid: str, type_def_name: str) - @dynamic_catch def delete_type_def(self, type_def_guid: str, type_def_name: str) -> None: """Delete a type definition that was added through the API.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_type_def(type_def_guid, type_def_name)) + return run_sync(self._async_delete_type_def(type_def_guid, type_def_name)) @dynamic_catch async def _async_delete_enum_def(self, enum_def_guid: str, enum_def_name: str) -> None: @@ -4790,5 +4737,4 @@ async def _async_delete_enum_def(self, enum_def_guid: str, enum_def_name: str) - @dynamic_catch def delete_enum_def(self, enum_def_guid: str, enum_def_name: str) -> None: """Delete an enum definition that was added through the API.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_enum_def(enum_def_guid, enum_def_name)) + return run_sync(self._async_delete_enum_def(enum_def_guid, enum_def_name)) diff --git a/pyegeria/omvs/my_profile.py b/pyegeria/omvs/my_profile.py index 0fcaea54..721c0be7 100644 --- a/pyegeria/omvs/my_profile.py +++ b/pyegeria/omvs/my_profile.py @@ -27,6 +27,7 @@ from pyegeria.view.base_report_formats import select_report_spec, get_report_spec_match from pyegeria.view.output_formatter import (populate_common_columns, resolve_output_formats, materialize_egeria_summary, select_report_format) import asyncio +from pyegeria.core.async_runner import run_sync class MyProfile(AssetMaker): @@ -462,8 +463,7 @@ def get_my_profile_by_get( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_profile_by_get(output_format, report_spec, **kwargs) ) @@ -507,7 +507,7 @@ def get_my_entries(self) -> list[dict]: list[dict] A list of dictionaries, each containing 'properties' and 'time' for an entry. """ - return asyncio.get_event_loop().run_until_complete(self._async_get_my_entries()) + return run_sync(self._async_get_my_entries()) @dynamic_catch def get_my_profile( @@ -534,7 +534,7 @@ def get_my_profile( One of the pyegeria exceptions will be raised if there are issues in communications, message format, or Egeria errors. """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_my_profile(body, output_format, report_spec,**kwargs) ) @@ -657,7 +657,7 @@ def add_my_profile(self, body: dict | NewElementRequestBody) -> str: } ``` """ - return asyncio.get_event_loop().run_until_complete(self._async_add_my_profile(body)) + return run_sync(self._async_add_my_profile(body)) @dynamic_catch async def _async_get_my_actors( @@ -703,8 +703,7 @@ def get_my_actors( **kwargs, ) -> list | str: """Return the list of actors linked to the user's profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_actors( graph_query_depth=graph_query_depth, start_from=start_from, @@ -759,8 +758,7 @@ def get_my_user_identities( **kwargs, ) -> list | str: """Return the list of user identities linked to the user's profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_user_identities( graph_query_depth=graph_query_depth, start_from=start_from, @@ -815,8 +813,7 @@ def get_my_roles( **kwargs, ) -> list | str: """Return the list of assigned roles linked to the user's profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_roles( graph_query_depth=graph_query_depth, start_from=start_from, @@ -872,8 +869,7 @@ def get_my_resources( **kwargs, ) -> list | str: """Return the list of assigned resources linked to the user's profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_resources( graph_query_depth=graph_query_depth, start_from=start_from, @@ -956,8 +952,7 @@ def get_my_assigned_actions( **kwargs, ) -> list | str: """Get assigned actions for the user profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_assigned_actions( metadata_element_type=metadata_element_type, metadata_element_subtypes=metadata_element_subtypes, @@ -1021,8 +1016,7 @@ def get_my_sponsored_actions( **kwargs, ) -> list | str: """Get actions sponsored by the user profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_sponsored_actions( activity_status_list=activity_status_list, start_from=start_from, @@ -1084,8 +1078,7 @@ def get_my_requested_actions( **kwargs, ) -> list | str: """Get actions requested by the user profile.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_my_requested_actions( activity_status_list=activity_status_list, start_from=start_from, @@ -1148,8 +1141,7 @@ def log_my_activity(self, text: str = None, display_name: str = None, body: Optional[dict | NewAttachmentRequestBody] = None, qualified_name: Optional[str] = None) -> str: """Add a notification to the user's activity log.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_log_my_activity(text, display_name, body, qualified_name)) + return run_sync(self._async_log_my_activity(text, display_name, body, qualified_name)) @dynamic_catch async def _async_journal_my_activity(self, text: str = None, display_name: str = None, @@ -1197,8 +1189,7 @@ def journal_my_activity(self, text: str = None, display_name: str = None, body: Optional[dict | NewAttachmentRequestBody] = None, qualified_name: Optional[str] = None) -> str: """Add a notification to the user's journal.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_journal_my_activity(text, display_name, body, qualified_name)) + return run_sync(self._async_journal_my_activity(text, display_name, body, qualified_name)) @dynamic_catch async def _async_blog_my_activity(self, text: str = None, display_name: str = None, @@ -1246,8 +1237,7 @@ def blog_my_activity(self, text: str = None, display_name: str = None, body: Optional[dict | NewAttachmentRequestBody] = None, qualified_name: Optional[str] = None) -> str: """Add a notification to the user's blog.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_blog_my_activity(text, display_name, body, qualified_name)) + return run_sync(self._async_blog_my_activity(text, display_name, body, qualified_name)) # # Lifecycle @@ -1381,8 +1371,7 @@ def create_my_todo(self, todo_name: str, activity_status: str = "REQUESTED", } } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_my_todo(todo_name, activity_status, + response = run_sync(self._async_create_my_todo(todo_name, activity_status, description, situation, priority, qualified_name)) return response @@ -1477,8 +1466,7 @@ def create_meeting(self, meeting_name: str, activity_status: str = "REQUESTED", ValidationError """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_meeting(meeting_name, activity_status, + response = run_sync(self._async_create_meeting(meeting_name, activity_status, description, situation, priority, qualified_name)) return response @@ -1568,8 +1556,7 @@ def create_review(self, review_name: str, activity_status: str = "REQUESTED", ValidationError """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_review(review_name, activity_status, + response = run_sync(self._async_create_review(review_name, activity_status, description, situation, priority, qualified_name)) return response @@ -1682,8 +1669,7 @@ def get_my_profile_by_post( ) -> dict | str: """Retrieve the profile details of the user associated with the token, using a POST request that accepts an optional body to restrict/format the result.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_my_profile_by_post(body, output_format, report_spec, **kwargs)) + return run_sync(self._async_get_my_profile_by_post(body, output_format, report_spec, **kwargs)) if __name__ == "__main__": diff --git a/pyegeria/omvs/notification_manager.py b/pyegeria/omvs/notification_manager.py index 5d0ae688..41e86db1 100644 --- a/pyegeria/omvs/notification_manager.py +++ b/pyegeria/omvs/notification_manager.py @@ -17,6 +17,7 @@ DeleteRelationshipRequestBody, ) from pyegeria.core.utils import dynamic_catch, body_slimmer +from pyegeria.core.async_runner import run_sync class NotificationManager(ServerClient): @@ -145,8 +146,7 @@ def link_monitored_resource( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_monitored_resource( notification_type_guid, monitored_resource_guid, body ) @@ -216,8 +216,7 @@ def detach_monitored_resource( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_monitored_resource( notification_type_guid, monitored_resource_guid, body ) @@ -286,8 +285,7 @@ def link_notification_subscriber( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_notification_subscriber( notification_type_guid, subscriber_guid, body ) @@ -352,8 +350,7 @@ def detach_notification_subscriber( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_notification_subscriber( notification_type_guid, subscriber_guid, body ) diff --git a/pyegeria/omvs/people_organizer.py b/pyegeria/omvs/people_organizer.py index 5adfcc31..0776a8d8 100644 --- a/pyegeria/omvs/people_organizer.py +++ b/pyegeria/omvs/people_organizer.py @@ -17,6 +17,7 @@ RelationshipBeanProperties, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class TeamStructureProperties(RelationshipBeanProperties): @@ -139,8 +140,7 @@ def link_peer_person( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_peer_person(person_one_guid, person_two_guid, body) ) @@ -220,8 +220,7 @@ def unlink_peer_person( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_peer_person(person_one_guid, person_two_guid, body) ) @@ -261,8 +260,7 @@ def detach_peer_person( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unlink_peer_person(person_one_guid, person_two_guid, body) ) @@ -348,8 +346,7 @@ def link_team_structure( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_team_structure(super_team_guid, subteam_guid, body) ) @@ -429,7 +426,6 @@ def detach_team_structure( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_team_structure(super_team_guid, subteam_guid, body) ) diff --git a/pyegeria/omvs/platform_services.py b/pyegeria/omvs/platform_services.py index 310a5458..08594918 100644 --- a/pyegeria/omvs/platform_services.py +++ b/pyegeria/omvs/platform_services.py @@ -20,6 +20,7 @@ print_basic_exception, ) from pyegeria.core._validators import validate_user_id +from pyegeria.core.async_runner import run_sync class Platform(BasePlatformClient): @@ -107,8 +108,7 @@ def get_connector_type(self, java_class_name: str) -> dict | str: PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_connector_type(java_class_name)) + return run_sync(self._async_get_connector_type(java_class_name)) async def _async_activate_server_stored_config( self, server: Optional[str] = None, timeout: int = 60 @@ -162,8 +162,7 @@ def activate_server_stored_config( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_activate_server_stored_config(server, timeout) ) return response @@ -228,8 +227,7 @@ def activate_server_supplied_config( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_activate_server_supplied_config(config_body, server, timeout) ) @@ -284,8 +282,7 @@ def get_active_server_instance_status(self, server: str = None) -> dict | str: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_active_server_instance_status(server) ) return response @@ -332,8 +329,7 @@ def get_known_servers(self) -> list[str] | str: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_known_servers()) + response = run_sync(self._async_get_known_servers()) return response async def _async_is_server_known(self, server: str = None) -> bool: @@ -383,8 +379,7 @@ def is_server_known(self, server: str = None) -> bool: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_is_server_known(server)) + response = run_sync(self._async_is_server_known(server)) return response async def _async_is_server_configured(self, server: str = None) -> bool: @@ -424,8 +419,7 @@ def is_server_configured(self, server: str = None) -> bool: bool Returns `True` if the server is configured, otherwise `False`. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_is_server_configured(server)) + response = run_sync(self._async_is_server_configured(server)) return response async def _async_get_active_configuration(self, server: str = None) -> dict | str: @@ -465,8 +459,7 @@ def get_active_configuration(self, server: str = None) -> dict | str: Returns configuration if server is active; InvalidParameter exception thrown otherwise """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_active_configuration(server)) + response = run_sync(self._async_get_active_configuration(server)) return response async def _async_check_server_active(self, server: str = None): @@ -500,8 +493,7 @@ def check_server_active(self, server: str = None): ------- bool: True if the server has been activated, otherwise False. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_check_server_active(server)) + response = run_sync(self._async_check_server_active(server)) return response async def _async_get_active_server_list(self) -> list: @@ -550,8 +542,7 @@ def get_active_server_list(self) -> list: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_active_server_list()) + response = run_sync(self._async_get_active_server_list()) return response async def _async_shutdown_platform(self) -> None: @@ -601,8 +592,7 @@ def shutdown_platform(self) -> None: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_shutdown_platform()) + run_sync(self._async_shutdown_platform()) async def _async_shutdown_server(self, server: str = None) -> None: """Shutdown a server on the associated platform. Async version. @@ -650,8 +640,7 @@ def shutdown_server(self, server: str = None) -> None: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_shutdown_server(server)) + run_sync(self._async_shutdown_server(server)) async def _async_shutdown_and_unregister_server(self, server: str = None) -> None: """Unregister a server from its cohorts and remove its configuration. Async version. @@ -703,8 +692,7 @@ def shutdown_and_unregister_server(self, server: str = None) -> None: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_shutdown_and_unregister_server(server)) + run_sync(self._async_shutdown_and_unregister_server(server)) async def _async_shutdown_unregister_servers(self) -> None: """ @@ -755,8 +743,7 @@ def shutdown_unregister_servers(self) -> None: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_shutdown_unregister_servers()) + run_sync(self._async_shutdown_unregister_servers()) async def _async_shutdown_all_servers(self) -> None: """ @@ -802,8 +789,7 @@ def shutdown_all_servers(self) -> None: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_shutdown_all_servers()) + run_sync(self._async_shutdown_all_servers()) async def _async_activate_server_if_down( self, server: str, verbose: bool = True, timeout: int = 60 @@ -890,8 +876,7 @@ def activate_server_if_down( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_activate_server_if_down(server, verbose, timeout) ) return response @@ -983,8 +968,7 @@ def activate_servers_on_platform( `activate_server_stored_config` method for each server. The method returns True if at least one server is successfully activated, otherwise it returns False. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_activate_servers_on_platform( server_list, verbose, timeout=timeout ) @@ -1075,8 +1059,7 @@ def activate_platform( that are down. If the platform is not active, it prints a message indicating so. If there is any exception while activating the platform or starting the servers, it prints an error message and the exception response. """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_activate_platform(platform_name, hosted_server_names, timeout) ) @@ -1094,8 +1077,7 @@ async def _async_get_platform_organization(self) -> str | None: def get_platform_organization(self) -> str | None: """Get the name of the organization that owns this platform.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_platform_organization()) + return run_sync(self._async_get_platform_organization()) async def _async_get_security_connection(self) -> dict: """Retrieve the Connection object used for platform security. Async version.""" @@ -1105,8 +1087,7 @@ async def _async_get_security_connection(self) -> dict: def get_security_connection(self) -> dict: """Retrieve the Connection object used for platform security.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_security_connection()) + return run_sync(self._async_get_security_connection()) async def _async_set_security_connection(self, body: dict) -> None: """Set up the connection for the platform security connector. Async version.""" @@ -1115,8 +1096,7 @@ async def _async_set_security_connection(self, body: dict) -> None: def set_security_connection(self, body: dict) -> None: """Set up the connection for the platform security connector.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_security_connection(body)) + run_sync(self._async_set_security_connection(body)) async def _async_delete_security_connection(self) -> None: """Remove the currently configured platform security connection. Async version.""" @@ -1125,8 +1105,7 @@ async def _async_delete_security_connection(self) -> None: def delete_security_connection(self) -> None: """Remove the currently configured platform security connection.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_security_connection()) + run_sync(self._async_delete_security_connection()) async def _async_get_security_user_list(self, status: str = None, user_type: str = None) -> list: """Get the list of users from the security connector. Async version.""" @@ -1141,8 +1120,7 @@ async def _async_get_security_user_list(self, status: str = None, user_type: str def get_security_user_list(self, status: str = None, user_type: str = None) -> list: """Get the list of users from the security connector.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_security_user_list(status, user_type)) + return run_sync(self._async_get_security_user_list(status, user_type)) async def _async_get_registered_services(self, service_category: Optional[str] = None) -> list: """Retrieve the list of registered services for a category. Async version.""" @@ -1155,38 +1133,31 @@ async def _async_get_registered_services(self, service_category: Optional[str] = def get_registered_access_services(self) -> list: """Retrieve the list of Open Metadata Access Services (OMASs).""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("access-services")) + return run_sync(self._async_get_registered_services("access-services")) def get_registered_view_services(self) -> list: """Retrieve the list of Open Metadata View Services (OMVSs).""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("view-services")) + return run_sync(self._async_get_registered_services("view-services")) def get_registered_engine_services(self) -> list: """Retrieve the list of engine services.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("engine-services")) + return run_sync(self._async_get_registered_services("engine-services")) def get_registered_governance_services(self) -> list: """Retrieve the list of governance services.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("governance-services")) + return run_sync(self._async_get_registered_services("governance-services")) def get_registered_common_services(self) -> list: """Retrieve the list of common services.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("common-services")) + return run_sync(self._async_get_registered_services("common-services")) def get_registered_integration_services(self) -> list: """Retrieve the list of integration services.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("integration-services")) + return run_sync(self._async_get_registered_services("integration-services")) def get_registered_all_services(self) -> list: """Retrieve the list of all registered services.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_registered_services("all-services")) + return run_sync(self._async_get_registered_services("all-services")) if __name__ == "__main__": diff --git a/pyegeria/omvs/privacy_officer.py b/pyegeria/omvs/privacy_officer.py index 2545f743..3f8a0646 100644 --- a/pyegeria/omvs/privacy_officer.py +++ b/pyegeria/omvs/privacy_officer.py @@ -16,6 +16,7 @@ DeleteRelationshipRequestBody, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class PrivacyOfficer(ServerClient): @@ -79,8 +80,7 @@ def link_permitted_processing( body: Union[dict, NewRelationshipRequestBody], ) -> None: """Link a data processing purpose to a data processing description.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_permitted_processing( data_processing_purpose_guid, data_processing_description_guid, body ) @@ -113,8 +113,7 @@ def detach_permitted_processing( body: Union[dict, DeleteRelationshipRequestBody], ) -> None: """Detach a data processing purpose from a data processing description.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_detach_permitted_processing( data_processing_purpose_guid, data_processing_description_guid, body ) @@ -147,8 +146,7 @@ def link_data_processing_target( body: Union[dict, NewRelationshipRequestBody], ) -> None: """Link a data processing action to a target element.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_data_processing_target( data_processing_action_guid, target_guid, body ) @@ -181,8 +179,7 @@ def detach_data_processing_target( body: Union[dict, DeleteRelationshipRequestBody], ) -> None: """Detach a data processing action from a target element.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_detach_data_processing_target( data_processing_action_guid, target_guid, body ) @@ -205,8 +202,7 @@ async def _async_link_data_processing_specification(self, element_guid: str, dat def link_data_processing_specification(self, element_guid: str, data_processing_description_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a data processing description to the element it specifies processing for (DataProcessingSpecification relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_data_processing_specification(element_guid, data_processing_description_guid, body)) + run_sync(self._async_link_data_processing_specification(element_guid, data_processing_description_guid, body)) @dynamic_catch async def _async_detach_data_processing_specification(self, element_guid: str, data_processing_description_guid: str, @@ -219,8 +215,7 @@ async def _async_detach_data_processing_specification(self, element_guid: str, d def detach_data_processing_specification(self, element_guid: str, data_processing_description_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a data processing description from an element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_data_processing_specification(element_guid, data_processing_description_guid, body)) + run_sync(self._async_detach_data_processing_specification(element_guid, data_processing_description_guid, body)) @dynamic_catch async def _async_link_detailed_processing_action(self, parent_processing_action_guid: str, child_processing_action_guid: str, @@ -233,8 +228,7 @@ async def _async_link_detailed_processing_action(self, parent_processing_action_ def link_detailed_processing_action(self, parent_processing_action_guid: str, child_processing_action_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a child processing action to the parent action it details (DetailedProcessingAction relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_detailed_processing_action(parent_processing_action_guid, child_processing_action_guid, body)) + run_sync(self._async_link_detailed_processing_action(parent_processing_action_guid, child_processing_action_guid, body)) @dynamic_catch async def _async_detach_detailed_processing_action(self, parent_processing_action_guid: str, child_processing_action_guid: str, @@ -247,5 +241,4 @@ async def _async_detach_detailed_processing_action(self, parent_processing_actio def detach_detailed_processing_action(self, parent_processing_action_guid: str, child_processing_action_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a detailed processing action from its parent action.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_detailed_processing_action(parent_processing_action_guid, child_processing_action_guid, body)) + run_sync(self._async_detach_detailed_processing_action(parent_processing_action_guid, child_processing_action_guid, body)) diff --git a/pyegeria/omvs/product_catalog.py b/pyegeria/omvs/product_catalog.py index f016f520..d814da35 100644 --- a/pyegeria/omvs/product_catalog.py +++ b/pyegeria/omvs/product_catalog.py @@ -14,6 +14,7 @@ from pyegeria.core.utils import dynamic_catch from pyegeria.models import SearchStringRequestBody from pyegeria.omvs.collection_manager import CollectionManager +from pyegeria.core.async_runner import run_sync class ProductCatalog(CollectionManager): @@ -105,7 +106,6 @@ def find_digital_product_catalogs( ) -> list | str: """Find digital product catalogs, or the products in them ("DigitalProduct"), through the product-catalog view service. See _async_find_digital_product_catalogs for the parameters.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_find_digital_product_catalogs( + return run_sync(self._async_find_digital_product_catalogs( search_string, metadata_element_type_name, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body, **kwargs)) diff --git a/pyegeria/omvs/product_manager.py b/pyegeria/omvs/product_manager.py index 492ef1c9..428f01ca 100644 --- a/pyegeria/omvs/product_manager.py +++ b/pyegeria/omvs/product_manager.py @@ -25,6 +25,7 @@ from pyegeria.core._globals import NO_ELEMENTS_FOUND from pyegeria.core.utils import dynamic_catch, body_slimmer from loguru import logger +from pyegeria.core.async_runner import run_sync class ProductManager(CollectionManager): @@ -203,8 +204,7 @@ def create_digital_product( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_digital_product(body)) + return run_sync(self._async_create_digital_product(body)) @dynamic_catch async def _async_update_digital_product( @@ -284,8 +284,7 @@ def update_digital_product( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_digital_product(digital_product_guid, body) ) @@ -368,8 +367,7 @@ def delete_digital_product( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_delete_digital_product(digital_product_guid, body, cascade) ) @@ -466,8 +464,7 @@ def get_digital_product_by_guid( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_digital_product_by_guid( graph_query_depth=graph_query_depth, guid=guid, body=body, output_format=output_format, report_spec=report_spec, **kwargs @@ -567,8 +564,7 @@ def get_digital_products_by_name( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_digital_products_by_name( graph_query_depth=graph_query_depth, name=name, classification_names=classification_names, body=body, start_from=start_from, page_size=page_size, output_format=output_format, report_spec=report_spec, **kwargs @@ -762,8 +758,7 @@ def find_digital_products( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_digital_products( search_string=search_string, graph_query_depth=graph_query_depth, @@ -882,8 +877,7 @@ def link_digital_product_dependency( } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_digital_product_dependency( consumer_product_guid, consumed_product_guid, body ) @@ -967,8 +961,7 @@ def detach_digital_product_dependency( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_digital_product_dependency( consumer_product_guid, consumed_product_guid, body ) @@ -1066,8 +1059,7 @@ def link_product_manager( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_product_manager( digital_product_guid, product_manager_role_guid, body ) @@ -1151,8 +1143,7 @@ def detach_product_manager( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_product_manager( digital_product_guid, product_manager_role_guid, body ) @@ -1241,8 +1232,7 @@ def create_digital_product_catalog( If there are issues in communications, message format, or Egeria errors. """ body = self._prepare_body(body) - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_digital_product_catalog(body)) + return run_sync(self._async_create_digital_product_catalog(body)) @dynamic_catch async def _async_update_digital_product_catalog( @@ -1303,8 +1293,7 @@ def update_digital_product_catalog( """ digital_product_catalog_guid = str(digital_product_catalog_guid) body = self._prepare_body(body) - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_digital_product_catalog(digital_product_catalog_guid, body) ) @@ -1375,8 +1364,7 @@ def delete_digital_product_catalog( if body is not None: body = self._prepare_body(body) cascade = bool(cascade) - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_delete_digital_product_catalog(digital_product_catalog_guid, body, cascade) ) @@ -1466,8 +1454,7 @@ def get_digital_product_catalog_by_guid( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_digital_product_catalog_by_guid( graph_query_depth=graph_query_depth, guid=guid, body=body, output_format=output_format, report_spec=report_spec, **kwargs @@ -1566,8 +1553,7 @@ def get_digital_product_catalogs_by_name( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_digital_product_catalogs_by_name( graph_query_depth=graph_query_depth, name=name, classification_names=classification_names, body=body, start_from=start_from, page_size=page_size, output_format=output_format, report_spec=report_spec, **kwargs @@ -1754,8 +1740,7 @@ def find_digital_product_catalogs( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_digital_product_catalogs( search_string=search_string, graph_query_depth=graph_query_depth, @@ -1787,8 +1772,7 @@ async def _async_update_digital_product_dependency(self, digital_product_depende def update_digital_product_dependency(self, digital_product_dependency_relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of a DigitalProductDependency relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_digital_product_dependency(digital_product_dependency_relationship_guid, body)) + run_sync(self._async_update_digital_product_dependency(digital_product_dependency_relationship_guid, body)) @dynamic_catch async def _async_detach_digital_product_dependency_by_id(self, digital_product_dependency_relationship_guid: str, @@ -1801,8 +1785,7 @@ async def _async_detach_digital_product_dependency_by_id(self, digital_product_d def detach_digital_product_dependency_by_id(self, digital_product_dependency_relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach one specific DigitalProductDependency relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_digital_product_dependency_by_id(digital_product_dependency_relationship_guid, body)) + run_sync(self._async_detach_digital_product_dependency_by_id(digital_product_dependency_relationship_guid, body)) # # Subscription types, and Open Data Contract / Product Standard (ODCS / ODPS) documents. @@ -1867,8 +1850,7 @@ def create_one_time_subscription( ) -> Optional[str]: """Add a one-time subscription type to a digital product. Returns the GUID of the governance action process that creates a subscription of this type.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_one_time_subscription(digital_product_guid, body)) + return run_sync(self._async_create_one_time_subscription(digital_product_guid, body)) @dynamic_catch async def _async_create_periodic_subscription( @@ -1904,8 +1886,7 @@ def create_periodic_subscription( ) -> Optional[str]: """Add a periodic subscription type to a digital product. Returns the GUID of the governance action process that creates a subscription of this type.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_periodic_subscription(digital_product_guid, body)) + return run_sync(self._async_create_periodic_subscription(digital_product_guid, body)) @dynamic_catch async def _async_create_ongoing_update_subscription( @@ -1943,8 +1924,7 @@ def create_ongoing_update_subscription( ) -> Optional[str]: """Add an ongoing-update subscription type to a digital product. Returns the GUID of the governance action process that creates a subscription of this type.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_ongoing_update_subscription(digital_product_guid, body)) + return run_sync(self._async_create_ongoing_update_subscription(digital_product_guid, body)) async def _async_post_document(self, url: str, document: str | dict) -> Optional[str]: """POST a data contract / data product document and return the "guid" the server answers with, if any. @@ -1969,8 +1949,7 @@ async def _async_publish_data_contract_string(self, integration_daemon_guid: str @dynamic_catch def publish_data_contract_string(self, integration_daemon_guid: str, document: str) -> None: """Send an ODCS data contract (YAML or JSON text) to an integration daemon for its Bitol listeners.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_publish_data_contract_string(integration_daemon_guid, document)) + return run_sync(self._async_publish_data_contract_string(integration_daemon_guid, document)) @dynamic_catch async def _async_publish_data_product_string(self, integration_daemon_guid: str, document: str) -> None: @@ -1983,8 +1962,7 @@ async def _async_publish_data_product_string(self, integration_daemon_guid: str, @dynamic_catch def publish_data_product_string(self, integration_daemon_guid: str, document: str) -> None: """Send an ODPS data product (YAML or JSON text) to an integration daemon for its Bitol listeners.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_publish_data_product_string(integration_daemon_guid, document)) + return run_sync(self._async_publish_data_product_string(integration_daemon_guid, document)) @dynamic_catch async def _async_import_data_contract_string(self, document: str) -> Optional[str]: @@ -1996,8 +1974,7 @@ async def _async_import_data_contract_string(self, document: str) -> Optional[st @dynamic_catch def import_data_contract_string(self, document: str) -> Optional[str]: """Catalog an ODCS data contract (YAML or JSON text) as a DataSharingAgreement. Returns its GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_import_data_contract_string(document)) + return run_sync(self._async_import_data_contract_string(document)) @dynamic_catch async def _async_import_data_contract(self, data_contract: dict) -> Optional[str]: @@ -2010,8 +1987,7 @@ async def _async_import_data_contract(self, data_contract: dict) -> Optional[str @dynamic_catch def import_data_contract(self, data_contract: dict) -> Optional[str]: """Catalog an ODCS data contract bean as a DataSharingAgreement. Returns its GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_import_data_contract(data_contract)) + return run_sync(self._async_import_data_contract(data_contract)) @dynamic_catch async def _async_import_data_product_string(self, document: str) -> Optional[str]: @@ -2023,8 +1999,7 @@ async def _async_import_data_product_string(self, document: str) -> Optional[str @dynamic_catch def import_data_product_string(self, document: str) -> Optional[str]: """Catalog an ODPS data product (YAML or JSON text) as a DigitalProduct. Returns its GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_import_data_product_string(document)) + return run_sync(self._async_import_data_product_string(document)) @dynamic_catch async def _async_import_data_product(self, data_product: dict) -> Optional[str]: @@ -2036,8 +2011,7 @@ async def _async_import_data_product(self, data_product: dict) -> Optional[str]: @dynamic_catch def import_data_product(self, data_product: dict) -> Optional[str]: """Catalog an ODPS data product bean as a DigitalProduct. Returns its GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_import_data_product(data_product)) + return run_sync(self._async_import_data_product(data_product)) @dynamic_catch async def _async_generate_data_contract(self, agreement_guid: str) -> dict | str: @@ -2050,8 +2024,7 @@ async def _async_generate_data_contract(self, agreement_guid: str) -> dict | str @dynamic_catch def generate_data_contract(self, agreement_guid: str) -> dict | str: """Generate the ODCS document that describes an agreement.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_generate_data_contract(agreement_guid)) + return run_sync(self._async_generate_data_contract(agreement_guid)) @dynamic_catch async def _async_generate_data_product(self, digital_product_guid: str) -> dict | str: @@ -2064,8 +2037,7 @@ async def _async_generate_data_product(self, digital_product_guid: str) -> dict @dynamic_catch def generate_data_product(self, digital_product_guid: str) -> dict | str: """Generate the ODPS document that describes a digital product.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_generate_data_product(digital_product_guid)) + return run_sync(self._async_generate_data_product(digital_product_guid)) @dynamic_catch async def _async_get_governance_action_processes_by_name( @@ -2125,7 +2097,6 @@ def get_governance_action_processes_by_name( ) -> list | str: """Retrieve the governance action processes with a matching qualified or display name (for example a digital product's subscription types).""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_governance_action_processes_by_name( + return run_sync(self._async_get_governance_action_processes_by_name( name, body=body, start_from=start_from, page_size=page_size, output_format=output_format, report_spec=report_spec, **kwargs)) diff --git a/pyegeria/omvs/project_manager.py b/pyegeria/omvs/project_manager.py index 1667aec6..391964ae 100644 --- a/pyegeria/omvs/project_manager.py +++ b/pyegeria/omvs/project_manager.py @@ -19,6 +19,7 @@ from pyegeria.view.output_formatter import populate_common_columns, overlay_additional_values, materialize_egeria_summary from pyegeria.core.utils import body_slimmer, dynamic_catch from loguru import logger +from pyegeria.core.async_runner import run_sync PROJECT_TYPES = ["Project", "Campaign", "StudyProject", "Task", "PersonalProject", "Experiment", "Investigation"] @@ -195,8 +196,7 @@ def get_linked_projects( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_linked_projects( parent_guid, body, @@ -303,8 +303,7 @@ def get_classified_projects( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_classified_projects(project_classification, start_from,page_size, @@ -408,8 +407,7 @@ def add_project_classification( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_project_classification(project_guid = project_guid, body=body ) @@ -503,8 +501,7 @@ def clear_project_classification( "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_project_classification(project_guid = project_guid, body=body ) @@ -639,8 +636,7 @@ def get_projects_by_classification_properties( } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_projects_by_classification_properties( approach, management_style, results_usage, start_from, page_size, output_format, report_spec, body, **kwargs) @@ -746,8 +742,7 @@ def get_project_team( PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_project_team(project_guid, team_role, start_from, page_size, output_format,report_spec, body, **kwargs ) ) @@ -834,8 +829,7 @@ def get_project_hierarchy( PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_project_hierarchy(project_guid, output_format, report_spec, body, **kwargs) ) return resp @@ -959,8 +953,7 @@ def find_projects( **kwargs, ) -> list | str: """ Retrieve the list of project metadata elements that contain the search string. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_projects( search_string=search_string, starts_with=starts_with, @@ -1037,8 +1030,7 @@ def get_projects_by_name( body: Optional[dict | FilterRequestBody] = None, **kwargs, ) -> list | str: - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_projects_by_name( filter_string=filter_string, classification_names=classification_names, @@ -1100,8 +1092,7 @@ def get_project_by_guid( **kwargs, ) -> dict | str: """Return the properties of a specific project.""" - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_project_by_guid( project_guid=project_guid, include_only_relationships=include_only_relationships, @@ -1197,8 +1188,7 @@ def get_project_graph( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_project_graph(project_guid, element_type, body, output_format, report_spec, **kwargs) ) @@ -1429,8 +1419,7 @@ def create_project( } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_create_project(anchor_guid, parent_guid, parent_relationship_type_name, parent_at_end1, display_name, description, classification_name, identifier, is_own_anchor, status, phase, health, start_date, planned_end_date, body) @@ -1556,8 +1545,7 @@ def create_project_from_template( } } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_project_from_template(body)) + resp = run_sync(self._async_create_project_from_template(body)) return resp # @@ -1706,8 +1694,7 @@ def update_project( NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_project(project_guid, qualified_name, identifier, display_name, description, project_status, project_phase, project_health, start_date, planned_end_date, merge_update, body)) @@ -1779,8 +1766,7 @@ def delete_project( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_project(project_guid, cascade, body)) + run_sync(self._async_delete_project(project_guid, cascade, body)) @dynamic_catch async def _async_archive_project(self, project_guid: str, @@ -1818,8 +1804,7 @@ def archive_project(self, project_guid: str, body: Optional[dict | DeleteElement body: dict | DeleteElementRequestBody, optional May set archiveDate, archiveProcess and archiveProperties; deleteMethod is always ARCHIVE. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_archive_project(project_guid, body)) + run_sync(self._async_archive_project(project_guid, body)) @dynamic_catch async def _async_set_project_dependency(self, project_guid: str, @@ -1893,8 +1878,7 @@ def set_project_dependency(self, project_guid: str, ----- """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_project_dependency(project_guid, upstream_project_guid, body)) @@ -1985,8 +1969,7 @@ def clear_project_dependency(self, project_guid: str, upstream_project_guid: str "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_project_dependency(project_guid, upstream_project_guid, body)) @dynamic_catch @@ -2062,8 +2045,7 @@ def set_project_hierarchy(self, project_guid: str, ----- """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_project_hierarchy(project_guid, parent_project_guid, body)) @@ -2154,8 +2136,7 @@ def clear_project_hierarchy(self, project_guid: str, parent_project_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_project_hierarchy(project_guid, parent_project_guid, body)) @dynamic_catch @@ -2257,8 +2238,7 @@ def add_to_project_team( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_to_project_team( project_guid, actor_guid, @@ -2339,8 +2319,7 @@ def remove_from_project_team( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_remove_from_project_team(project_guid, actor_guid, body) ) @@ -2397,8 +2376,7 @@ def create_project_task( body: Optional[dict | NewElementRequestBody] = None ) -> str: """Create a new task for a project. """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_create_project_task(project_guid, display_name, identifier, description, status, phase, health, start_date, planned_end_date, body) ) @@ -2430,8 +2408,7 @@ async def _async_set_project_as_campaign(self, project_guid: str, def set_project_as_campaign(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a campaign.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_campaign(project_guid, body)) + run_sync(self._async_set_project_as_campaign(project_guid, body)) @dynamic_catch async def _async_clear_project_as_campaign(self, project_guid: str, @@ -2445,8 +2422,7 @@ async def _async_clear_project_as_campaign(self, project_guid: str, def clear_project_as_campaign(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the campaign classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_campaign(project_guid, body)) + run_sync(self._async_clear_project_as_campaign(project_guid, body)) @dynamic_catch async def _async_set_project_as_task(self, project_guid: str, @@ -2462,8 +2438,7 @@ async def _async_set_project_as_task(self, project_guid: str, def set_project_as_task(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a task.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_task(project_guid, body)) + run_sync(self._async_set_project_as_task(project_guid, body)) @dynamic_catch async def _async_clear_project_as_task(self, project_guid: str, @@ -2477,8 +2452,7 @@ async def _async_clear_project_as_task(self, project_guid: str, def clear_project_as_task(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the task classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_task(project_guid, body)) + run_sync(self._async_clear_project_as_task(project_guid, body)) @dynamic_catch async def _async_set_project_as_personal_project(self, project_guid: str, @@ -2494,8 +2468,7 @@ async def _async_set_project_as_personal_project(self, project_guid: str, def set_project_as_personal_project(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a personal project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_personal_project(project_guid, body)) + run_sync(self._async_set_project_as_personal_project(project_guid, body)) @dynamic_catch async def _async_clear_project_as_personal_project(self, project_guid: str, @@ -2509,8 +2482,7 @@ async def _async_clear_project_as_personal_project(self, project_guid: str, def clear_project_as_personal_project(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the personal project classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_personal_project(project_guid, body)) + run_sync(self._async_clear_project_as_personal_project(project_guid, body)) @dynamic_catch async def _async_set_project_as_study_project(self, project_guid: str, @@ -2526,8 +2498,7 @@ async def _async_set_project_as_study_project(self, project_guid: str, def set_project_as_study_project(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a study project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_study_project(project_guid, body)) + run_sync(self._async_set_project_as_study_project(project_guid, body)) @dynamic_catch async def _async_clear_project_as_study_project(self, project_guid: str, @@ -2541,8 +2512,7 @@ async def _async_clear_project_as_study_project(self, project_guid: str, def clear_project_as_study_project(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the study project classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_study_project(project_guid, body)) + run_sync(self._async_clear_project_as_study_project(project_guid, body)) @dynamic_catch async def _async_set_project_as_experiment(self, project_guid: str, @@ -2558,8 +2528,7 @@ async def _async_set_project_as_experiment(self, project_guid: str, def set_project_as_experiment(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a experiment.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_experiment(project_guid, body)) + run_sync(self._async_set_project_as_experiment(project_guid, body)) @dynamic_catch async def _async_clear_project_as_experiment(self, project_guid: str, @@ -2573,8 +2542,7 @@ async def _async_clear_project_as_experiment(self, project_guid: str, def clear_project_as_experiment(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the experiment classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_experiment(project_guid, body)) + run_sync(self._async_clear_project_as_experiment(project_guid, body)) @dynamic_catch async def _async_set_project_as_investigation(self, project_guid: str, @@ -2590,8 +2558,7 @@ async def _async_set_project_as_investigation(self, project_guid: str, def set_project_as_investigation(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as an investigation that is seeking to answer a question.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_investigation(project_guid, body)) + run_sync(self._async_set_project_as_investigation(project_guid, body)) @dynamic_catch async def _async_clear_project_as_investigation(self, project_guid: str, @@ -2605,8 +2572,7 @@ async def _async_clear_project_as_investigation(self, project_guid: str, def clear_project_as_investigation(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the investigation classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_investigation(project_guid, body)) + run_sync(self._async_clear_project_as_investigation(project_guid, body)) @dynamic_catch async def _async_set_project_as_glossary_project(self, project_guid: str, @@ -2622,8 +2588,7 @@ async def _async_set_project_as_glossary_project(self, project_guid: str, def set_project_as_glossary_project(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a glossary project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_glossary_project(project_guid, body)) + run_sync(self._async_set_project_as_glossary_project(project_guid, body)) @dynamic_catch async def _async_clear_project_as_glossary_project(self, project_guid: str, @@ -2637,8 +2602,7 @@ async def _async_clear_project_as_glossary_project(self, project_guid: str, def clear_project_as_glossary_project(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the glossary project classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_glossary_project(project_guid, body)) + run_sync(self._async_clear_project_as_glossary_project(project_guid, body)) @dynamic_catch async def _async_set_project_as_governance_project(self, project_guid: str, @@ -2654,8 +2618,7 @@ async def _async_set_project_as_governance_project(self, project_guid: str, def set_project_as_governance_project(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a governance project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_as_governance_project(project_guid, body)) + run_sync(self._async_set_project_as_governance_project(project_guid, body)) @dynamic_catch async def _async_clear_project_as_governance_project(self, project_guid: str, @@ -2669,8 +2632,7 @@ async def _async_clear_project_as_governance_project(self, project_guid: str, def clear_project_as_governance_project(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the governance project classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_as_governance_project(project_guid, body)) + run_sync(self._async_clear_project_as_governance_project(project_guid, body)) @dynamic_catch async def _async_set_project_kind(self, project_guid: str, @@ -2686,8 +2648,7 @@ async def _async_set_project_kind(self, project_guid: str, def set_project_kind(self, project_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a project as a project kind.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_project_kind(project_guid, body)) + run_sync(self._async_set_project_kind(project_guid, body)) @dynamic_catch async def _async_clear_project_kind(self, project_guid: str, @@ -2701,8 +2662,7 @@ async def _async_clear_project_kind(self, project_guid: str, def clear_project_kind(self, project_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the project kind classification from a project.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_project_kind(project_guid, body)) + run_sync(self._async_clear_project_kind(project_guid, body)) if __name__ == "__main__": diff --git a/pyegeria/omvs/reference_data.py b/pyegeria/omvs/reference_data.py index 237c0c95..2eb97885 100644 --- a/pyegeria/omvs/reference_data.py +++ b/pyegeria/omvs/reference_data.py @@ -20,6 +20,7 @@ from pyegeria.view.output_formatter import populate_common_columns from pyegeria.core.utils import dynamic_catch from loguru import logger +from pyegeria.core.async_runner import run_sync class ReferenceDataManager(ServerClient): @@ -274,8 +275,7 @@ def find_valid_value_definitions( ValidationError """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_find_valid_value_definitions( search_string=search_string, graph_query_depth=graph_query_depth, @@ -334,8 +334,7 @@ def get_valid_value_definitions_by_name( report_spec: str | dict = None, **kwargs) -> list | str: - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_valid_value_definitions_by_name( name=name, classification_names=classification_names, @@ -462,8 +461,7 @@ def get_valid_value_definition_by_guid(self, guid: str, element_type: Optional[s "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_valid_value_definition_by_guid(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, @@ -628,8 +626,7 @@ def create_valid_value_definition(self, body: dict | NewElementRequestBody) -> s "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_create_valid_value_definition(body) ) return resp @@ -776,8 +773,7 @@ def create_valid_value_definition_from_template( """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_create_valid_value_definition_from_template(body)) + resp = run_sync(self._async_create_valid_value_definition_from_template(body)) return resp # @@ -914,8 +910,7 @@ def update_valid_value_definition( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_valid_value_definition(vv_def_guid, body)) @dynamic_catch @@ -1010,8 +1005,7 @@ def link_valid_value_definition( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_valid_value_member(vv_set_guid, vv_member_guid, body)) + run_sync(self._async_link_valid_value_member(vv_set_guid, vv_member_guid, body)) @dynamic_catch async def _async_detach_valid_value_member(self, vv_set_guid: str, vv_member_guid: str, @@ -1100,8 +1094,7 @@ def detach_valid_value_definition( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_valid_value_member(vv_set_guid, vv_member_guid, body, cascade_delete)) @dynamic_catch @@ -1192,8 +1185,7 @@ def link_valid_values_assignment( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_valid_values_assignment(element_guid, vv_def_guid, body)) + run_sync(self._async_link_valid_values_assignment(element_guid, vv_def_guid, body)) @dynamic_catch async def _async_detach_valid_values_assignment( @@ -1281,8 +1273,7 @@ def detach_valid_values_assignment( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_valid_values_assignment(element_guid, vv_def_guid, body, cascade_delete)) @dynamic_catch @@ -1381,8 +1372,7 @@ def link_reference_value_assignment( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_reference_value_assignment(element_guid, vv_def_guid, body)) + run_sync(self._async_link_reference_value_assignment(element_guid, vv_def_guid, body)) @dynamic_catch async def _async_detach_reference_value_assignment( @@ -1470,8 +1460,7 @@ def detach_reference_value_assignment( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_reference_value_assignment(element_guid, vv_def_guid, body, cascade_delete)) @dynamic_catch @@ -1577,8 +1566,7 @@ def link_valid_value_implementation( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_valid_value_implementation(vv_def_guid, element_guid, body)) + return run_sync(self._async_link_valid_value_implementation(vv_def_guid, element_guid, body)) @dynamic_catch async def _async_detach_valid_value_implementation( @@ -1666,8 +1654,7 @@ def detach_valid_value_implementation( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_valid_value_implementation(vv_def_guid, element_guid, body, cascade_delete)) @dynamic_catch @@ -1762,8 +1749,7 @@ def link_associated_valid_values( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_associated_valid_values(vv_def_one_guid, vv_def_two_guid, body)) + run_sync(self._async_link_associated_valid_values(vv_def_one_guid, vv_def_two_guid, body)) @dynamic_catch async def _async_detach_associated_valid_values( @@ -1853,8 +1839,7 @@ def detach_associated_valid_values( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_associated_valid_values(vv_def_one_guid, vv_def_two_guid, body, cascade_delete)) @dynamic_catch @@ -1941,8 +1926,7 @@ def link_consistent_valid_values( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_consistent_valid_values(vv_def_one_guid, vv_def_two_guid, body)) + run_sync(self._async_link_consistent_valid_values(vv_def_one_guid, vv_def_two_guid, body)) @dynamic_catch async def _async_detach_consistent_valid_values( @@ -2032,8 +2016,7 @@ def detach_consistent_valid_values( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_consistent_valid_values(vv_def_one_guid, vv_def_two_guid, body, cascade_delete)) @dynamic_catch @@ -2136,8 +2119,7 @@ def link_mapped_valid_values( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_mapped_valid_values(vv_def_one_guid, vv_def_two_guid, body)) + run_sync(self._async_link_mapped_valid_values(vv_def_one_guid, vv_def_two_guid, body)) @dynamic_catch async def _async_detach_mapped_valid_values( @@ -2227,8 +2209,7 @@ def detach_mapped_valid_values( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_mapped_valid_values(vv_def_one_guid, vv_def_two_guid, body, cascade_delete)) @dynamic_catch @@ -2313,8 +2294,7 @@ def delete_valid_value_definition( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_valid_value_definition(vv_def_guid, cascade_delete, body)) + run_sync(self._async_delete_valid_value_definition(vv_def_guid, cascade_delete, body)) @@ -2336,8 +2316,7 @@ async def _async_update_valid_value_implementation(self, valid_values_implementa def update_valid_value_implementation(self, valid_values_implementation_relationship_guid: str, body: Optional[dict | UpdateRelationshipRequestBody] = None) -> None: """Update the properties of a ValidValuesImplementation relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_valid_value_implementation(valid_values_implementation_relationship_guid, body)) + run_sync(self._async_update_valid_value_implementation(valid_values_implementation_relationship_guid, body)) @dynamic_catch async def _async_detach_valid_value_implementation_by_id(self, valid_values_implementation_relationship_guid: str, @@ -2350,8 +2329,7 @@ async def _async_detach_valid_value_implementation_by_id(self, valid_values_impl def detach_valid_value_implementation_by_id(self, valid_values_implementation_relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach one specific ValidValuesImplementation relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_valid_value_implementation_by_id(valid_values_implementation_relationship_guid, body)) + run_sync(self._async_detach_valid_value_implementation_by_id(valid_values_implementation_relationship_guid, body)) if __name__ == "__main__": diff --git a/pyegeria/omvs/runtime_manager.py b/pyegeria/omvs/runtime_manager.py index 72d87ca6..d1bf890e 100644 --- a/pyegeria/omvs/runtime_manager.py +++ b/pyegeria/omvs/runtime_manager.py @@ -25,6 +25,7 @@ ) from pyegeria.view.output_formatter import populate_columns_from_properties, \ _extract_referenceable_properties, get_required_relationships +from pyegeria.core.async_runner import run_sync class RuntimeManager(ServerClient): """ @@ -208,8 +209,7 @@ def get_integration_connector_config_properties( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_integration_connector_config_properties( connector_name, server_guid, server_name, qualified_name, organization_name, output_format, report_spec, body ) @@ -333,8 +333,7 @@ def update_connector_configuration( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_connector_configuration( connector_name, server_guid, @@ -448,8 +447,7 @@ def update_endpoint_address( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_endpoint_address( connector_name, endpoint_address, @@ -563,8 +561,7 @@ def update_connector_connection( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_update_connector_connection( connector_name, connection, @@ -676,8 +673,7 @@ def restart_connector( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_restart_connector( connector_name, server_guid, display_name, qualified_name, organization_name, body ) @@ -753,8 +749,7 @@ def connect_to_cohort( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_connect_to_cohort(cohort_name, server_guid, server_name, organization_name, body) ) return @@ -828,8 +823,7 @@ def disconnect_from_cohort( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_disconnect_from_cohort(cohort_name, server_guid, server_name, organization_name, body) ) return @@ -903,8 +897,7 @@ def unregister_from_cohort( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_unregister_from_cohort(cohort_name, server_guid, server_name, organization_name, body) ) return @@ -1015,8 +1008,7 @@ def refresh_gov_eng_config( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_refresh_gov_eng_config( gov_engine_name, server_guid, display_name, qualified_name, body, **kwargs ) @@ -1122,8 +1114,7 @@ def refresh_integ_group_config( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_refresh_integ_group_config( integ_group_name, server_guid, display_name, qualified_name, organization_name, body, **kwargs ) @@ -1230,8 +1221,7 @@ def refresh_integration_connector( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_refresh_integration_connector( connector_name, server_guid, @@ -1347,8 +1337,7 @@ def refresh_governance_engine( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_refresh_gov_engine( gov_engine_name, server_guid, @@ -1456,8 +1445,7 @@ def publish_open_lineage_event( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_publish_open_lineage_event(ol_event, server_guid, display_name, qualified_name, organization_name, body) ) @@ -1572,8 +1560,7 @@ def publish_open_lineage_event_string( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_publish_open_lineage_event_string( ol_event_string, server_guid, display_name, qualified_name, organization_name, body ) @@ -1680,8 +1667,7 @@ def add_archive_content( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_archive_content( archive_content, server_guid, display_name, qualified_name, timeout, body ) @@ -1793,8 +1779,7 @@ def add_archive_file( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_archive_file( archive_file, server_guid, display_name, qualified_name, timeout, organization_name, body ) @@ -1871,8 +1856,7 @@ def shutdown_and_unregister_server( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_shutdown_and_unregister_server(server_guid, qualified_name, body) ) return @@ -1961,8 +1945,7 @@ def activate_server_with_stored_config( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_activate_server_with_stored_config( server_guid, display_name, qualified_name, timeout, organization_name, body ) @@ -2032,8 +2015,7 @@ def shutdown_server( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_shutdown_server(server_guid, qualified_name, body) ) return @@ -2071,8 +2053,7 @@ def get_platforms_by_name( Response A list of JSONdict with the platform reports. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_platforms_by_name( filter_string=filter_string, start_from=start_from, @@ -2238,8 +2219,7 @@ def get_platforms_by_type( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_platforms_by_type( filter_string=filter_string, start_from=start_from, @@ -2347,8 +2327,7 @@ def get_platform_templates_by_type( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_platform_templates_by_type( filter_string=filter_string, effective_time=effective_time, @@ -2441,8 +2420,7 @@ def get_platform_report( PyegeriaAPIException PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_platform_report(platform_guid, platform_name, output_format, report_spec) ) @@ -2517,8 +2495,7 @@ def get_platform_by_guid( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_platform_by_guid(platform_guid, graph_query_depth, output_format, report_spec, body) ) return response @@ -2571,8 +2548,7 @@ def get_connector_type(self, platform_guid: str, java_class_name: str) -> dict | PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_connector_type(platform_guid, java_class_name)) + return run_sync(self._async_get_connector_type(platform_guid, java_class_name)) @dynamic_catch async def _async_get_server_by_guid( @@ -2651,8 +2627,7 @@ def get_server_by_guid( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_server_by_guid(server_guid, output_format=output_format, graph_query_depth=graph_query_depth, report_spec=report_spec, body=body) @@ -2748,8 +2723,7 @@ def get_servers_by_name( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_servers_by_name( filter_string=filter_string, start_from=start_from, @@ -2845,8 +2819,7 @@ def get_servers_by_dep_impl_type(self, search_string: str = "*", effective_time: report_spec (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_servers_by_dep_impl_type(search_string, start_from,page_size, output_format, report_spec, body) ) @@ -2942,8 +2915,7 @@ def get_server_templates_by_dep_impl_type( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_server_templates_by_dep_impl_type( filter_string=filter_string, start_from=start_from, @@ -3042,8 +3014,7 @@ def get_server_report( PyegeriaUnauthorizedException """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_server_report(server_guid, server_name, output_format, report_spec, organization_name) ) @@ -3272,7 +3243,7 @@ def create_metadata_repository_cohort(self, body: Optional[dict | NewElementRequ PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - return asyncio.get_event_loop().run_until_complete(self._async_create_metadata_repository_cohort(body)) + return run_sync(self._async_create_metadata_repository_cohort(body)) @dynamic_catch async def _async_create_metadata_repository_cohort_from_template( @@ -3317,7 +3288,7 @@ def create_metadata_repository_cohort_from_template( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_create_metadata_repository_cohort_from_template(body)) @dynamic_catch @@ -3364,8 +3335,7 @@ def update_metadata_repository_cohort(self, cohort_guid: str, body: dict | Updat PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_metadata_repository_cohort(cohort_guid, body)) + run_sync(self._async_update_metadata_repository_cohort(cohort_guid, body)) @dynamic_catch async def _async_delete_metadata_repository_cohort(self, cohort_guid: str, @@ -3419,8 +3389,7 @@ def delete_metadata_repository_cohort(self, cohort_guid: str, PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_metadata_repository_cohort(cohort_guid, body, cascade)) + run_sync(self._async_delete_metadata_repository_cohort(cohort_guid, body, cascade)) @dynamic_catch async def _async_get_metadata_repository_cohorts_by_name( @@ -3502,8 +3471,7 @@ def get_metadata_repository_cohorts_by_name( **kwargs, ) -> list | str: """Returns the list of metadata repository cohorts with a particular name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_metadata_repository_cohorts_by_name( name, metadata_element_type_name, metadata_element_subtypes, graph_query_depth, start_from, page_size, output_format, report_spec, body, **kwargs @@ -3603,8 +3571,7 @@ def find_metadata_repository_cohorts( **kwargs, ) -> list | str: """Retrieve the list of metadata repository cohorts that contain the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_metadata_repository_cohorts( search_string, starts_with, ends_with, ignore_case, metadata_element_type_name, metadata_element_subtypes, graph_query_depth, start_from, page_size, output_format, @@ -3669,8 +3636,7 @@ def get_metadata_repository_cohort_by_guid( **kwargs, ) -> dict | str: """Return the properties of a specific metadata repository cohort.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_metadata_repository_cohort_by_guid( guid, graph_query_depth, output_format, report_spec, body, **kwargs ) @@ -3727,8 +3693,7 @@ async def _async_link_cohort_member(self, cohort_guid: str, cohort_member_guid: def link_cohort_member(self, cohort_guid: str, cohort_member_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """ Connect a cohort to one of its members.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_cohort_member(cohort_guid, cohort_member_guid, body)) + run_sync(self._async_link_cohort_member(cohort_guid, cohort_member_guid, body)) @dynamic_catch async def _async_detach_cohort_member(self, cohort_guid: str, cohort_member_guid: str, @@ -3775,8 +3740,7 @@ async def _async_detach_cohort_member(self, cohort_guid: str, cohort_member_guid def detach_cohort_member(self, cohort_guid: str, cohort_member_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """ Detach a cohort member from a cohort.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_cohort_member(cohort_guid, cohort_member_guid, body)) + run_sync(self._async_detach_cohort_member(cohort_guid, cohort_member_guid, body)) # connect_to_cohort/disconnect_from_cohort/unregister_from_cohort (POST, # above) already cover connectToCohort/disconnectFromCohort/ @@ -3811,8 +3775,7 @@ async def _async_connect_to_cohort_get(self, server_guid: str, cohort_name: str) @dynamic_catch def connect_to_cohort_get(self, server_guid: str, cohort_name: str) -> None: """ Register this server's metadata collection with the other servers in the cohort (GET variant).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_connect_to_cohort_get(server_guid, cohort_name)) + run_sync(self._async_connect_to_cohort_get(server_guid, cohort_name)) @dynamic_catch async def _async_disconnect_from_cohort_get(self, server_guid: str, cohort_name: str) -> None: @@ -3840,8 +3803,7 @@ async def _async_disconnect_from_cohort_get(self, server_guid: str, cohort_name: @dynamic_catch def disconnect_from_cohort_get(self, server_guid: str, cohort_name: str) -> None: """ Disconnect communications from a specific cohort (GET variant).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_disconnect_from_cohort_get(server_guid, cohort_name)) + run_sync(self._async_disconnect_from_cohort_get(server_guid, cohort_name)) @dynamic_catch async def _async_unregister_from_cohort_get(self, server_guid: str, cohort_name: str) -> None: @@ -3870,8 +3832,7 @@ async def _async_unregister_from_cohort_get(self, server_guid: str, cohort_name: @dynamic_catch def unregister_from_cohort_get(self, server_guid: str, cohort_name: str) -> None: """ Unregister from a specific cohort and disconnect from cohort communications (GET variant).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_unregister_from_cohort_get(server_guid, cohort_name)) + run_sync(self._async_unregister_from_cohort_get(server_guid, cohort_name)) @dynamic_catch async def _async_get_elements_by_category( @@ -3998,8 +3959,7 @@ def get_elements_by_category( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_elements_by_category( category, start_from, page_size, skip_relationships, relationships_page_size, output_format, report_spec, body, **kwargs diff --git a/pyegeria/omvs/schema_maker.py b/pyegeria/omvs/schema_maker.py index 397779d5..f36e179f 100644 --- a/pyegeria/omvs/schema_maker.py +++ b/pyegeria/omvs/schema_maker.py @@ -32,6 +32,7 @@ overlay_additional_values, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class SchemaTypeProperties(ReferenceableProperties): @@ -120,8 +121,7 @@ async def _async_create_schema_type(self, body: dict | NewElementRequestBody) -> return await self._async_create_element_body_request(url, "SchemaTypeProperties", body) def create_schema_type(self, body: dict | NewElementRequestBody) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_schema_type(body)) + return run_sync(self._async_create_schema_type(body)) @dynamic_catch async def _async_update_schema_type( @@ -131,8 +131,7 @@ async def _async_update_schema_type( await self._async_update_element_body_request(url, body=body) def update_schema_type(self, schema_type_guid: str, body: dict | UpdateElementRequestBody) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_schema_type(schema_type_guid, body)) + run_sync(self._async_update_schema_type(schema_type_guid, body)) @dynamic_catch async def _async_delete_schema_type( @@ -152,8 +151,7 @@ async def _async_delete_schema_type( def delete_schema_type(self, schema_type_guid: str, body: Optional[dict | DeleteElementRequestBody] = None, cascade_delete: bool = False) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_schema_type(schema_type_guid, body, cascade_delete)) + run_sync(self._async_delete_schema_type(schema_type_guid, body, cascade_delete)) # Schema Attributes @@ -163,8 +161,7 @@ async def _async_create_schema_attribute(self, body: dict | NewElementRequestBod return await self._async_create_element_body_request(url, "SchemaAttributeProperties", body) def create_schema_attribute(self, body: dict | NewElementRequestBody) -> str: - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_schema_attribute(body)) + return run_sync(self._async_create_schema_attribute(body)) @dynamic_catch async def _async_update_schema_attribute( @@ -176,8 +173,7 @@ async def _async_update_schema_attribute( def update_schema_attribute( self, schema_attribute_guid: str, body: dict | UpdateElementRequestBody ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_schema_attribute(schema_attribute_guid, body)) + run_sync(self._async_update_schema_attribute(schema_attribute_guid, body)) @dynamic_catch async def _async_delete_schema_attribute( @@ -193,8 +189,7 @@ def delete_schema_attribute( self, schema_attribute_guid: str, body: Optional[dict | DeleteElementRequestBody] = None, cascade_delete: bool = False ) -> None: - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_schema_attribute(schema_attribute_guid, body, cascade_delete)) + run_sync(self._async_delete_schema_attribute(schema_attribute_guid, body, cascade_delete)) @dynamic_catch async def _async_find_schema_types( @@ -393,8 +388,7 @@ def find_schema_types( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_schema_types( search_string=search_string, graph_query_depth=graph_query_depth, @@ -451,8 +445,7 @@ def get_schema_type_by_guid( report_spec: str | dict = "SchemaTypes", **kwargs, ) -> dict | str: - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_schema_type_by_guid( graph_query_depth=graph_query_depth, guid=guid, element_type=element_type, body=body, output_format=output_format, report_spec=report_spec, @@ -468,8 +461,7 @@ async def _async_create_schema_type_from_template(self, body: dict | TemplateReq def create_schema_type_from_template(self, body: dict | TemplateRequestBody) -> str: """Create a schema type from a template.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_schema_type_from_template(body)) + return run_sync(self._async_create_schema_type_from_template(body)) @dynamic_catch async def _async_create_schema_attribute_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -479,8 +471,7 @@ async def _async_create_schema_attribute_from_template(self, body: dict | Templa def create_schema_attribute_from_template(self, body: dict | TemplateRequestBody) -> str: """Create a schema attribute from a template.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_schema_attribute_from_template(body)) + return run_sync(self._async_create_schema_attribute_from_template(body)) @dynamic_catch async def _async_get_schema_types_by_name(self, name: str | None = None, start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: @@ -490,8 +481,7 @@ async def _async_get_schema_types_by_name(self, name: str | None = None, start_f def get_schema_types_by_name(self, name: str | None = None, start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: """Get schema types by name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_schema_types_by_name(name, start_from, page_size, **kwargs)) + return run_sync(self._async_get_schema_types_by_name(name, start_from, page_size, **kwargs)) @dynamic_catch async def _async_get_schema_attributes_by_name(self, name: str | None = None, start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: @@ -501,8 +491,7 @@ async def _async_get_schema_attributes_by_name(self, name: str | None = None, st def get_schema_attributes_by_name(self, name: str | None = None, start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: """Get schema attributes by name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_schema_attributes_by_name(name, start_from, page_size, **kwargs)) + return run_sync(self._async_get_schema_attributes_by_name(name, start_from, page_size, **kwargs)) @dynamic_catch async def _async_find_schema_attributes(self, search_string: str = "*", start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: @@ -512,8 +501,7 @@ async def _async_find_schema_attributes(self, search_string: str = "*", start_fr def find_schema_attributes(self, search_string: str = "*", start_from: int = 0, page_size: int = 100, **kwargs) -> list | str: """Find schema attributes.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_find_schema_attributes(search_string, start_from, page_size, **kwargs)) + return run_sync(self._async_find_schema_attributes(search_string, start_from, page_size, **kwargs)) @dynamic_catch async def _async_get_schema_attribute_by_guid(self, guid: str, **kwargs) -> dict | str: @@ -523,8 +511,7 @@ async def _async_get_schema_attribute_by_guid(self, guid: str, **kwargs) -> dict def get_schema_attribute_by_guid(self, guid: str, **kwargs) -> dict | str: """Get schema attribute by GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_schema_attribute_by_guid(guid, **kwargs)) + return run_sync(self._async_get_schema_attribute_by_guid(guid, **kwargs)) # # Relationship and classification maintenance - added to close the gap @@ -546,8 +533,7 @@ async def _async_link_nested_schema_attribute(self, schema_attribute_guid: str, def link_nested_schema_attribute(self, schema_attribute_guid: str, nested_schema_attribute_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a nested schema attribute to its parent schema attribute (NestedSchemaAttribute relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_nested_schema_attribute(schema_attribute_guid, nested_schema_attribute_guid, body)) + run_sync(self._async_link_nested_schema_attribute(schema_attribute_guid, nested_schema_attribute_guid, body)) @dynamic_catch async def _async_detach_nested_schema_attribute(self, schema_attribute_guid: str, nested_schema_attribute_guid: str, @@ -564,8 +550,7 @@ def detach_nested_schema_attribute(self, schema_attribute_guid: str, nested_sche body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a nested schema attribute from its parent schema attribute.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_nested_schema_attribute( + run_sync(self._async_detach_nested_schema_attribute( schema_attribute_guid, nested_schema_attribute_guid, body, cascade_delete)) @dynamic_catch @@ -581,8 +566,7 @@ async def _async_link_attribute_for_schema(self, schema_type_guid: str, schema_a def link_attribute_for_schema(self, schema_type_guid: str, schema_attribute_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a schema attribute to the schema type that it belongs to (AttributeForSchema relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_attribute_for_schema(schema_type_guid, schema_attribute_guid, body)) + run_sync(self._async_link_attribute_for_schema(schema_type_guid, schema_attribute_guid, body)) @dynamic_catch async def _async_detach_attribute_for_schema(self, schema_type_guid: str, schema_attribute_guid: str, @@ -599,8 +583,7 @@ def detach_attribute_for_schema(self, schema_type_guid: str, schema_attribute_gu body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a schema attribute from the schema type that it belongs to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_attribute_for_schema( + run_sync(self._async_detach_attribute_for_schema( schema_type_guid, schema_attribute_guid, body, cascade_delete)) @dynamic_catch @@ -616,8 +599,7 @@ async def _async_link_foreign_key(self, primary_key_column_guid: str, foreign_ke def link_foreign_key(self, primary_key_column_guid: str, foreign_key_column_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a foreign key column to the primary key column that it refers to (ForeignKey relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_foreign_key(primary_key_column_guid, foreign_key_column_guid, body)) + run_sync(self._async_link_foreign_key(primary_key_column_guid, foreign_key_column_guid, body)) @dynamic_catch async def _async_detach_foreign_key(self, primary_key_column_guid: str, foreign_key_column_guid: str, @@ -634,8 +616,7 @@ def detach_foreign_key(self, primary_key_column_guid: str, foreign_key_column_gu body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a foreign key column from the primary key column that it refers to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_foreign_key( + run_sync(self._async_detach_foreign_key( primary_key_column_guid, foreign_key_column_guid, body, cascade_delete)) @dynamic_catch @@ -651,8 +632,7 @@ async def _async_link_external_schema_type(self, schema_element_guid: str, schem def link_external_schema_type(self, schema_element_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a schema element to a reusable, externally-defined schema type (LinkedExternalSchemaType relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_external_schema_type(schema_element_guid, schema_type_guid, body)) + run_sync(self._async_link_external_schema_type(schema_element_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_external_schema_type(self, schema_element_guid: str, schema_type_guid: str, @@ -669,8 +649,7 @@ def detach_external_schema_type(self, schema_element_guid: str, schema_type_guid body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a schema element from a reusable, externally-defined schema type.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_external_schema_type( + run_sync(self._async_detach_external_schema_type( schema_element_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -686,8 +665,7 @@ async def _async_link_map_from_schema_type(self, schema_element_guid: str, schem def link_map_from_schema_type(self, schema_element_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach the 'from' end of a map schema type (MapFromElementType relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_map_from_schema_type(schema_element_guid, schema_type_guid, body)) + run_sync(self._async_link_map_from_schema_type(schema_element_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_map_from_schema_type(self, schema_element_guid: str, schema_type_guid: str, @@ -704,8 +682,7 @@ def detach_map_from_schema_type(self, schema_element_guid: str, schema_type_guid body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach the 'from' end of a map schema type.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_map_from_schema_type( + run_sync(self._async_detach_map_from_schema_type( schema_element_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -721,8 +698,7 @@ async def _async_link_map_to_schema_type(self, schema_element_guid: str, schema_ def link_map_to_schema_type(self, schema_element_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach the 'to' end of a map schema type (MapToElementType relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_map_to_schema_type(schema_element_guid, schema_type_guid, body)) + run_sync(self._async_link_map_to_schema_type(schema_element_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_map_to_schema_type(self, schema_element_guid: str, schema_type_guid: str, @@ -739,8 +715,7 @@ def detach_map_to_schema_type(self, schema_element_guid: str, schema_type_guid: body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach the 'to' end of a map schema type.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_map_to_schema_type( + run_sync(self._async_detach_map_to_schema_type( schema_element_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -756,8 +731,7 @@ async def _async_link_graph_edge(self, graph_edge_guid: str, graph_vertex_guid: def link_graph_edge(self, graph_edge_guid: str, graph_vertex_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a graph edge to one of the vertices it connects (GraphEdgeLink relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_graph_edge(graph_edge_guid, graph_vertex_guid, body)) + run_sync(self._async_link_graph_edge(graph_edge_guid, graph_vertex_guid, body)) @dynamic_catch async def _async_detach_graph_edge(self, graph_edge_guid: str, graph_vertex_guid: str, @@ -774,8 +748,7 @@ def detach_graph_edge(self, graph_edge_guid: str, graph_vertex_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a graph edge from one of the vertices it connects.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_graph_edge( + run_sync(self._async_detach_graph_edge( graph_edge_guid, graph_vertex_guid, body, cascade_delete)) @dynamic_catch @@ -791,8 +764,7 @@ async def _async_link_query_target(self, schema_element_guid: str, query_target_ def link_query_target(self, schema_element_guid: str, query_target_schema_element_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a query target to a derived schema element (DerivedSchemaTypeQueryTarget relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_query_target(schema_element_guid, query_target_schema_element_guid, body)) + run_sync(self._async_link_query_target(schema_element_guid, query_target_schema_element_guid, body)) @dynamic_catch async def _async_detach_query_target(self, schema_element_guid: str, query_target_schema_element_guid: str, @@ -809,8 +781,7 @@ def detach_query_target(self, schema_element_guid: str, query_target_schema_elem body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a query target from a derived schema element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_query_target( + run_sync(self._async_detach_query_target( schema_element_guid, query_target_schema_element_guid, body, cascade_delete)) @dynamic_catch @@ -826,8 +797,7 @@ async def _async_link_schema(self, element_guid: str, schema_type_guid: str, def link_schema(self, element_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a schema type to the element it describes (SchemaTypeAssociation relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_schema(element_guid, schema_type_guid, body)) + run_sync(self._async_link_schema(element_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_schema(self, element_guid: str, schema_type_guid: str, @@ -844,8 +814,7 @@ def detach_schema(self, element_guid: str, schema_type_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a schema type from the element it describes.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_schema( + run_sync(self._async_detach_schema( element_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -861,8 +830,7 @@ async def _async_link_relational_db_schema(self, database_schema_type_list_guid: def link_relational_db_schema(self, database_schema_type_list_guid: str, relational_db_schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a relational database schema to the schema type list it belongs to (RelationalDBSchema relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_relational_db_schema( + run_sync(self._async_link_relational_db_schema( database_schema_type_list_guid, relational_db_schema_type_guid, body)) @dynamic_catch @@ -880,8 +848,7 @@ def detach_relational_db_schema(self, database_schema_type_list_guid: str, relat body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a relational database schema from the schema type list it belongs to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_relational_db_schema( + run_sync(self._async_detach_relational_db_schema( database_schema_type_list_guid, relational_db_schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -897,8 +864,7 @@ async def _async_link_api_operations(self, api_schema_type_guid: str, api_operat def link_api_operations(self, api_schema_type_guid: str, api_operation_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach an API operation to the API schema type it belongs to (APIOperations relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_api_operations(api_schema_type_guid, api_operation_guid, body)) + run_sync(self._async_link_api_operations(api_schema_type_guid, api_operation_guid, body)) @dynamic_catch async def _async_detach_api_operations(self, api_schema_type_guid: str, api_operation_guid: str, @@ -915,8 +881,7 @@ def detach_api_operations(self, api_schema_type_guid: str, api_operation_guid: s body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach an API operation from the API schema type it belongs to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_api_operations( + run_sync(self._async_detach_api_operations( api_schema_type_guid, api_operation_guid, body, cascade_delete)) @dynamic_catch @@ -932,8 +897,7 @@ async def _async_link_api_header(self, api_operation_guid: str, schema_type_guid def link_api_header(self, api_operation_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a schema type as the header for an API operation (APIHeader relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_api_header(api_operation_guid, schema_type_guid, body)) + run_sync(self._async_link_api_header(api_operation_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_api_header(self, api_operation_guid: str, schema_type_guid: str, @@ -950,8 +914,7 @@ def detach_api_header(self, api_operation_guid: str, schema_type_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a schema type as the header for an API operation.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_api_header( + run_sync(self._async_detach_api_header( api_operation_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -967,8 +930,7 @@ async def _async_link_api_request(self, api_operation_guid: str, schema_type_gui def link_api_request(self, api_operation_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a schema type as the request for an API operation (APIRequest relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_api_request(api_operation_guid, schema_type_guid, body)) + run_sync(self._async_link_api_request(api_operation_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_api_request(self, api_operation_guid: str, schema_type_guid: str, @@ -985,8 +947,7 @@ def detach_api_request(self, api_operation_guid: str, schema_type_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a schema type as the request for an API operation.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_api_request( + run_sync(self._async_detach_api_request( api_operation_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -1002,8 +963,7 @@ async def _async_link_api_response(self, api_operation_guid: str, schema_type_gu def link_api_response(self, api_operation_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a schema type as the response for an API operation (APIResponse relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_api_response(api_operation_guid, schema_type_guid, body)) + run_sync(self._async_link_api_response(api_operation_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_api_response(self, api_operation_guid: str, schema_type_guid: str, @@ -1020,8 +980,7 @@ def detach_api_response(self, api_operation_guid: str, schema_type_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach a schema type as the response for an API operation.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_api_response( + run_sync(self._async_detach_api_response( api_operation_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -1037,8 +996,7 @@ async def _async_link_schema_type_option(self, schema_element_guid: str, schema_ def link_schema_type_option(self, schema_element_guid: str, schema_type_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach an optional schema type to a schema element (SchemaTypeOption relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_schema_type_option(schema_element_guid, schema_type_guid, body)) + run_sync(self._async_link_schema_type_option(schema_element_guid, schema_type_guid, body)) @dynamic_catch async def _async_detach_schema_type_option(self, schema_element_guid: str, schema_type_guid: str, @@ -1055,8 +1013,7 @@ def detach_schema_type_option(self, schema_element_guid: str, schema_type_guid: body: Optional[dict | DeleteRelationshipRequestBody] = None, cascade_delete: bool = False) -> None: """Detach an optional schema type from a schema element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_schema_type_option( + run_sync(self._async_detach_schema_type_option( schema_element_guid, schema_type_guid, body, cascade_delete)) @dynamic_catch @@ -1074,8 +1031,7 @@ async def _async_add_primary_key_classification(self, relational_column_guid: st def add_primary_key_classification(self, relational_column_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a relational column as a primary key.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_primary_key_classification(relational_column_guid, body)) + run_sync(self._async_add_primary_key_classification(relational_column_guid, body)) @dynamic_catch async def _async_remove_primary_key_classification(self, relational_column_guid: str, @@ -1092,8 +1048,7 @@ def remove_primary_key_classification(self, relational_column_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None, cascade_delete: bool = False) -> None: """Remove the PrimaryKey classification from a relational column.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_primary_key_classification( + run_sync(self._async_remove_primary_key_classification( relational_column_guid, body, cascade_delete)) @dynamic_catch @@ -1111,8 +1066,7 @@ async def _async_add_type_embedded_attribute(self, schema_attribute_guid: str, def add_type_embedded_attribute(self, schema_attribute_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a schema attribute as having its type embedded rather than linked (TypeEmbeddedAttribute).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_type_embedded_attribute(schema_attribute_guid, body)) + run_sync(self._async_add_type_embedded_attribute(schema_attribute_guid, body)) @dynamic_catch async def _async_remove_type_embedded_attribute(self, schema_attribute_guid: str, @@ -1129,8 +1083,7 @@ def remove_type_embedded_attribute(self, schema_attribute_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None, cascade_delete: bool = False) -> None: """Remove the TypeEmbeddedAttribute classification from a schema attribute.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_type_embedded_attribute( + run_sync(self._async_remove_type_embedded_attribute( schema_attribute_guid, body, cascade_delete)) @dynamic_catch @@ -1148,8 +1101,7 @@ async def _async_add_calculated_value(self, schema_attribute_guid: str, def add_calculated_value(self, schema_attribute_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a schema attribute as holding a calculated (derived) value.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_add_calculated_value(schema_attribute_guid, body)) + run_sync(self._async_add_calculated_value(schema_attribute_guid, body)) @dynamic_catch async def _async_remove_calculated_value(self, schema_attribute_guid: str, @@ -1166,6 +1118,5 @@ def remove_calculated_value(self, schema_attribute_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None, cascade_delete: bool = False) -> None: """Remove the CalculatedValue classification from a schema attribute.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_remove_calculated_value( + run_sync(self._async_remove_calculated_value( schema_attribute_guid, body, cascade_delete)) diff --git a/pyegeria/omvs/security_officer.py b/pyegeria/omvs/security_officer.py index a3dfac04..e9986837 100644 --- a/pyegeria/omvs/security_officer.py +++ b/pyegeria/omvs/security_officer.py @@ -30,6 +30,7 @@ ControlImplementationStatus, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class SecurityOfficer(ServerClient): @@ -115,8 +116,7 @@ def set_user_account( self, platform_name: str, body: Union[dict, UserAccountRequestBody], platform_guid: str = None ) -> None: """Create or update a user account in the platform metadata security connector.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_set_user_account(platform_name, body, platform_guid)) + return run_sync(self._async_set_user_account(platform_name, body, platform_guid)) @dynamic_catch async def _async_get_user_account(self, platform_name: str, user_id: str, platform_guid: str = None) -> dict: @@ -131,8 +131,7 @@ async def _async_get_user_account(self, platform_name: str, user_id: str, platfo def get_user_account(self, platform_name: str, user_id: str, platform_guid: str = None) -> dict: """Return the user account object for the requested user.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_user_account(platform_name, user_id, platform_guid)) + return run_sync(self._async_get_user_account(platform_name, user_id, platform_guid)) @dynamic_catch async def _async_delete_user_account(self, platform_name: str, user_id: str, platform_guid: str = None) -> None: @@ -144,8 +143,7 @@ async def _async_delete_user_account(self, platform_name: str, user_id: str, pla def delete_user_account(self, platform_name: str, user_id: str, platform_guid: str = None) -> None: """Clear the account for a user with the platform security connector.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_user_account(platform_name, user_id, platform_guid)) + return run_sync(self._async_delete_user_account(platform_name, user_id, platform_guid)) @dynamic_catch async def _async_get_user_list( @@ -190,8 +188,7 @@ def get_user_list( platform_guid: str = None, ) -> list[str]: """Return the list of users registered with the platform security connector.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_user_list(platform_name, status, user_type, platform_guid) ) @@ -219,8 +216,7 @@ def link_governance_zones( body: Union[dict, NewRelationshipRequestBody], ) -> None: """Attach a nested governance zone to a broader governance zone definition.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_link_governance_zones( governance_zone_guid, nested_governance_zone_guid, body ) @@ -250,8 +246,7 @@ def detach_governance_zones( body: Union[dict, DeleteRelationshipRequestBody], ) -> None: """Detach a governance zone definition from a hierarchical relationship.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_detach_governance_zones( governance_zone_guid, nested_governance_zone_guid, body ) @@ -328,8 +323,7 @@ def set_security_access_control( platform_guid : str, optional Pre-resolved GUID of the platform, bypassing the name lookup. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_set_security_access_control(platform_name, body, platform_guid) ) @@ -382,8 +376,7 @@ def get_security_access_control( platform_guid : str, optional Pre-resolved GUID of the platform, bypassing the name lookup. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_security_access_control(platform_name, control_name, platform_guid) ) @@ -432,8 +425,7 @@ def delete_security_access_control( platform_guid : str, optional Pre-resolved GUID of the platform, bypassing the name lookup. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_delete_security_access_control(platform_name, control_name, platform_guid) ) @@ -516,8 +508,7 @@ def find_security_roles( **kwargs, ) -> list | str: """Return the list of security roles matching the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_security_roles( search_string=search_string, starts_with=starts_with, @@ -615,8 +606,7 @@ def find_security_groups( **kwargs, ) -> list | str: """Return the list of security groups matching the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_security_groups( search_string=search_string, starts_with=starts_with, @@ -656,8 +646,7 @@ async def _async_link_resource_permissions(self, secrets_collection_guid: str, s def link_resource_permissions(self, secrets_collection_guid: str, security_access_control_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a security access control to a secrets collection it grants permission for (ResourcePermissions relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_resource_permissions(secrets_collection_guid, security_access_control_guid, body)) + run_sync(self._async_link_resource_permissions(secrets_collection_guid, security_access_control_guid, body)) @dynamic_catch async def _async_detach_resource_permissions(self, secrets_collection_guid: str, security_access_control_guid: str, @@ -670,8 +659,7 @@ async def _async_detach_resource_permissions(self, secrets_collection_guid: str, def detach_resource_permissions(self, secrets_collection_guid: str, security_access_control_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a security access control from a secrets collection.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_resource_permissions(secrets_collection_guid, security_access_control_guid, body)) + run_sync(self._async_detach_resource_permissions(secrets_collection_guid, security_access_control_guid, body)) @dynamic_catch async def _async_link_secrets_collection_security_list(self, secrets_collection_guid: str, security_list_guid: str, @@ -684,8 +672,7 @@ async def _async_link_secrets_collection_security_list(self, secrets_collection_ def link_secrets_collection_security_list(self, secrets_collection_guid: str, security_list_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a security list to a secrets collection it governs (SecretsCollectionSecurityList relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_secrets_collection_security_list(secrets_collection_guid, security_list_guid, body)) + run_sync(self._async_link_secrets_collection_security_list(secrets_collection_guid, security_list_guid, body)) @dynamic_catch async def _async_detach_secrets_collection_security_list(self, secrets_collection_guid: str, security_list_guid: str, @@ -698,8 +685,7 @@ async def _async_detach_secrets_collection_security_list(self, secrets_collectio def detach_secrets_collection_security_list(self, secrets_collection_guid: str, security_list_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a security list from a secrets collection.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_secrets_collection_security_list(secrets_collection_guid, security_list_guid, body)) + run_sync(self._async_detach_secrets_collection_security_list(secrets_collection_guid, security_list_guid, body)) @dynamic_catch async def _async_link_user_account(self, secrets_collection_guid: str, user_identity_guid: str, @@ -712,8 +698,7 @@ async def _async_link_user_account(self, secrets_collection_guid: str, user_iden def link_user_account(self, secrets_collection_guid: str, user_identity_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a user identity to a secrets collection holding its account secrets (UserAccount relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_user_account(secrets_collection_guid, user_identity_guid, body)) + run_sync(self._async_link_user_account(secrets_collection_guid, user_identity_guid, body)) @dynamic_catch async def _async_detach_user_account(self, secrets_collection_guid: str, user_identity_guid: str, @@ -726,8 +711,7 @@ async def _async_detach_user_account(self, secrets_collection_guid: str, user_id def detach_user_account(self, secrets_collection_guid: str, user_identity_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a user identity from a secrets collection.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_user_account(secrets_collection_guid, user_identity_guid, body)) + run_sync(self._async_detach_user_account(secrets_collection_guid, user_identity_guid, body)) @dynamic_catch async def _async_set_user_account_profile(self, secrets_collection_guid: str, @@ -742,8 +726,7 @@ async def _async_set_user_account_profile(self, secrets_collection_guid: str, def set_user_account_profile(self, secrets_collection_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a secrets collection with its user account profile statistics.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_user_account_profile(secrets_collection_guid, body)) + run_sync(self._async_set_user_account_profile(secrets_collection_guid, body)) @dynamic_catch async def _async_clear_user_account_profile(self, secrets_collection_guid: str, @@ -756,8 +739,7 @@ async def _async_clear_user_account_profile(self, secrets_collection_guid: str, def clear_user_account_profile(self, secrets_collection_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the UserAccountProfile classification from a secrets collection.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_user_account_profile(secrets_collection_guid, body)) + run_sync(self._async_clear_user_account_profile(secrets_collection_guid, body)) @dynamic_catch async def _async_set_zone_membership_profile(self, governance_zone_guid: str, @@ -772,8 +754,7 @@ async def _async_set_zone_membership_profile(self, governance_zone_guid: str, def set_zone_membership_profile(self, governance_zone_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify a governance zone with its zone membership profile (e.g. allowed security groups).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_set_zone_membership_profile(governance_zone_guid, body)) + run_sync(self._async_set_zone_membership_profile(governance_zone_guid, body)) @dynamic_catch async def _async_clear_zone_membership_profile(self, governance_zone_guid: str, @@ -786,8 +767,7 @@ async def _async_clear_zone_membership_profile(self, governance_zone_guid: str, def clear_zone_membership_profile(self, governance_zone_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the ZoneMembershipProfile classification from a governance zone.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_clear_zone_membership_profile(governance_zone_guid, body)) + run_sync(self._async_clear_zone_membership_profile(governance_zone_guid, body)) # # Statements of applicability - which controls from a standard (such as the @@ -826,8 +806,7 @@ def create_statement_of_applicability(self, body: Optional[dict | NewElementRequ str The GUID of the new statement of applicability. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_statement_of_applicability(body)) + return run_sync(self._async_create_statement_of_applicability(body)) @dynamic_catch async def _async_create_statement_of_applicability_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -838,8 +817,7 @@ async def _async_create_statement_of_applicability_from_template(self, body: dic @dynamic_catch def create_statement_of_applicability_from_template(self, body: dict | TemplateRequestBody) -> str: """Create a statement of applicability using an existing one as a template.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_statement_of_applicability_from_template(body)) + return run_sync(self._async_create_statement_of_applicability_from_template(body)) @dynamic_catch async def _async_update_statement_of_applicability(self, soa_guid: str, @@ -851,8 +829,7 @@ async def _async_update_statement_of_applicability(self, soa_guid: str, @dynamic_catch def update_statement_of_applicability(self, soa_guid: str, body: dict | UpdateElementRequestBody) -> None: """Update the properties of a statement of applicability - for example, to approve it.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_statement_of_applicability(soa_guid, body)) + run_sync(self._async_update_statement_of_applicability(soa_guid, body)) @dynamic_catch async def _async_delete_statement_of_applicability(self, soa_guid: str, @@ -866,8 +843,7 @@ async def _async_delete_statement_of_applicability(self, soa_guid: str, def delete_statement_of_applicability(self, soa_guid: str, body: Optional[dict | DeleteElementRequestBody] = None, cascade: bool = False) -> None: """Delete a statement of applicability.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_statement_of_applicability(soa_guid, body, cascade)) + run_sync(self._async_delete_statement_of_applicability(soa_guid, body, cascade)) def _generate_statement_of_applicability_output( self, @@ -938,8 +914,7 @@ def get_statements_of_applicability_by_name( **kwargs, ) -> list | str: """Return the statements of applicability with a particular name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_statements_of_applicability_by_name( filter_string=filter_string, metadata_element_subtypes=metadata_element_subtypes, @@ -1026,8 +1001,7 @@ def find_statements_of_applicability( **kwargs, ) -> list | str: """Return the statements of applicability that contain the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_statements_of_applicability( search_string=search_string, starts_with=starts_with, @@ -1098,8 +1072,7 @@ def get_statement_of_applicability_by_guid( Each linked control, with its ControlApplicability relationship properties, is returned in the element's otherRelatedElements list. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_statement_of_applicability_by_guid( soa_guid=soa_guid, include_only_relationships=include_only_relationships, @@ -1150,8 +1123,7 @@ def link_control_applicability(self, soa_guid: str, control_guid: str, body : dict | NewRelationshipRequestBody, optional Request body whose properties class is ControlApplicabilityProperties. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_control_applicability(soa_guid, control_guid, body)) + run_sync(self._async_link_control_applicability(soa_guid, control_guid, body)) @dynamic_catch async def _async_detach_control_applicability(self, soa_guid: str, control_guid: str, @@ -1165,8 +1137,7 @@ async def _async_detach_control_applicability(self, soa_guid: str, control_guid: def detach_control_applicability(self, soa_guid: str, control_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Remove a control from a statement of applicability.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_control_applicability(soa_guid, control_guid, body)) + run_sync(self._async_detach_control_applicability(soa_guid, control_guid, body)) @staticmethod def _control_applicability_rows(soa: dict) -> list[dict]: @@ -1261,8 +1232,7 @@ def get_statement_of_applicability_controls( See _async_get_statement_of_applicability_controls. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_statement_of_applicability_controls( soa_guid, output_format=output_format, report_spec=report_spec, body=body, **kwargs ) @@ -1302,5 +1272,4 @@ def get_control_implementation_summary(self, soa_guid: str, See _async_get_control_implementation_summary. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_control_implementation_summary(soa_guid, body)) + return run_sync(self._async_get_control_implementation_summary(soa_guid, body)) diff --git a/pyegeria/omvs/server_operations.py b/pyegeria/omvs/server_operations.py index f6fbf1ec..2d0795e7 100644 --- a/pyegeria/omvs/server_operations.py +++ b/pyegeria/omvs/server_operations.py @@ -12,6 +12,7 @@ from typing import Any, Optional from pyegeria.omvs.platform_services import Platform from pyegeria.core._validators import validate_name +from pyegeria.core.async_runner import run_sync class ServerOps(Platform): @@ -82,8 +83,7 @@ def get_active_configuration(self, server: str = None) -> dict | str: Returns configuration if server is active; InvalidParameter exception thrown otherwise """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_active_configuration(server)) + response = run_sync(self._async_get_active_configuration(server)) return response # @@ -136,8 +136,7 @@ def add_archive_file( Response object. Also throws exceptions if no viable server or endpoint errors """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_archive_file(archive_file, server, timeout) ) @@ -190,8 +189,7 @@ def add_archive(self, archive_connection: str, server: str = None) -> None: Response object. Also throws exceptions if no viable server or endpoint errors """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_add_archive(archive_connection, server) ) @@ -249,8 +247,7 @@ def get_active_server_status(self, server: str = None) -> dict: NotAuthorizedException The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_active_server_status(server)) + response = run_sync(self._async_get_active_server_status(server)) return response.json() async def _async_get_active_service_list_for_server( @@ -292,8 +289,7 @@ def get_active_service_list_for_server(self, server: str = None) -> Response: Response object. Also throws exceptions if no viable endpoint or errors """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_active_service_list_for_server(server) ) return response @@ -339,8 +335,7 @@ def get_governance_engine_summaries(self, server: str = None) -> dict: The response object containing the governance engine summaries. """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_governance_engine_summaries(server) ) return response @@ -362,8 +357,7 @@ async def _async_get_integration_daemon_status( def get_integration_daemon_status(self, server: str = None) -> dict | str: """Get the current status of the integration daemon. Async version.""" - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_integration_daemon_status(server) ) return response @@ -391,8 +385,7 @@ def get_connector_config( """Retrieve the configuration properties of the named integration connector running in the integration daemon""" - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_connector_config(connector_name, server) ) return response @@ -423,8 +416,7 @@ def restart_integration_connector( self, connector_name: str, server: str = None ) -> str: """Restart the integration Connector specified by connector_name or all if not specified""" - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_restart_integration_connector(connector_name, server) ) return response @@ -455,8 +447,7 @@ def refresh_integration_connectors( self, connector_name: str, server: Optional[str] = None, timeout: int = 60 ) -> None: """Restart the integration Connector specified by connector_name""" - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_refresh_integration_connectors(connector_name, server, timeout) ) diff --git a/pyegeria/omvs/solution_architect.py b/pyegeria/omvs/solution_architect.py index 92b8cdbe..1c387db2 100644 --- a/pyegeria/omvs/solution_architect.py +++ b/pyegeria/omvs/solution_architect.py @@ -29,6 +29,7 @@ from pyegeria.view.output_formatter import extract_mermaid_only, \ populate_common_columns from pyegeria.core.utils import body_slimmer, dynamic_catch +from pyegeria.core.async_runner import run_sync sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) @@ -133,8 +134,7 @@ async def _async_create_design_pattern(self, body: dict | NewElementRequestBody) def create_design_pattern(self, body: dict | NewElementRequestBody): """Create a design pattern.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_design_pattern(body)) + return run_sync(self._async_create_design_pattern(body)) async def _async_create_design_pattern_from_template(self, body: dict | TemplateRequestBody): url = f"{self.solution_architect_command_root}/design-patterns/from-template" @@ -143,8 +143,7 @@ async def _async_create_design_pattern_from_template(self, body: dict | Template def create_design_pattern_from_template(self, body: dict | TemplateRequestBody): """Create a design pattern from template.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_design_pattern_from_template(body)) + return run_sync(self._async_create_design_pattern_from_template(body)) async def _async_update_design_pattern(self, guid: str, body: dict | UpdateElementRequestBody): validate_guid(guid) @@ -153,8 +152,7 @@ async def _async_update_design_pattern(self, guid: str, body: dict | UpdateEleme def update_design_pattern(self, guid: str, body: dict | UpdateElementRequestBody): """Update a design pattern.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_design_pattern(guid, body)) + return run_sync(self._async_update_design_pattern(guid, body)) async def _async_link_nested_design_patterns(self, parent_guid: str, child_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None): validate_guid(parent_guid) @@ -164,8 +162,7 @@ async def _async_link_nested_design_patterns(self, parent_guid: str, child_guid: def link_nested_design_patterns(self, parent_guid: str, child_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None): """Link nested design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_nested_design_patterns(parent_guid, child_guid, body)) + return run_sync(self._async_link_nested_design_patterns(parent_guid, child_guid, body)) async def _async_detach_nested_design_patterns(self, parent_guid: str, child_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): validate_guid(parent_guid) @@ -175,8 +172,7 @@ async def _async_detach_nested_design_patterns(self, parent_guid: str, child_gui def detach_nested_design_patterns(self, parent_guid: str, child_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): """Detach nested design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_nested_design_patterns(parent_guid, child_guid, body)) + return run_sync(self._async_detach_nested_design_patterns(parent_guid, child_guid, body)) async def _async_link_specialized_design_patterns(self, general_guid: str, special_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None): validate_guid(general_guid) @@ -186,8 +182,7 @@ async def _async_link_specialized_design_patterns(self, general_guid: str, speci def link_specialized_design_patterns(self, general_guid: str, special_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None): """Link specialized design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_specialized_design_patterns(general_guid, special_guid, body)) + return run_sync(self._async_link_specialized_design_patterns(general_guid, special_guid, body)) async def _async_detach_specialized_design_patterns(self, general_guid: str, special_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): validate_guid(general_guid) @@ -197,8 +192,7 @@ async def _async_detach_specialized_design_patterns(self, general_guid: str, spe def detach_specialized_design_patterns(self, general_guid: str, special_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): """Detach specialized design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_specialized_design_patterns(general_guid, special_guid, body)) + return run_sync(self._async_detach_specialized_design_patterns(general_guid, special_guid, body)) async def _async_link_related_design_patterns(self, guid1: str, guid2: str, body: Optional[dict | NewRelationshipRequestBody] = None): validate_guid(guid1) @@ -208,8 +202,7 @@ async def _async_link_related_design_patterns(self, guid1: str, guid2: str, body def link_related_design_patterns(self, guid1: str, guid2: str, body: Optional[dict | NewRelationshipRequestBody] = None): """Link related design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_related_design_patterns(guid1, guid2, body)) + return run_sync(self._async_link_related_design_patterns(guid1, guid2, body)) async def _async_detach_related_design_patterns(self, guid1: str, guid2: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): validate_guid(guid1) @@ -219,8 +212,7 @@ async def _async_detach_related_design_patterns(self, guid1: str, guid2: str, bo def detach_related_design_patterns(self, guid1: str, guid2: str, body: Optional[dict | DeleteRelationshipRequestBody] = None): """Detach related design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_detach_related_design_patterns(guid1, guid2, body)) + return run_sync(self._async_detach_related_design_patterns(guid1, guid2, body)) async def _async_delete_design_pattern(self, guid: str, body: Optional[dict | DeleteElementRequestBody] = None): validate_guid(guid) @@ -229,8 +221,7 @@ async def _async_delete_design_pattern(self, guid: str, body: Optional[dict | De def delete_design_pattern(self, guid: str, body: Optional[dict | DeleteElementRequestBody] = None): """Delete a design pattern.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_delete_design_pattern(guid, body)) + return run_sync(self._async_delete_design_pattern(guid, body)) async def _async_find_design_patterns(self, search_string: str = "*", body: Optional[dict | SearchStringRequestBody] = None, starts_with: bool = True, ends_with: bool = False, ignore_case: bool = False, @@ -260,8 +251,7 @@ def find_design_patterns(self, search_string: str = "*", body: Optional[dict | S start_from: int = 0, page_size: int = 100, graph_query_depth: int = 3, output_format: str = "JSON", report_spec: str | dict = "Design-Pattern-DrE", **kwargs): """Find design patterns.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_find_design_patterns(search_string, body, starts_with, ends_with, + return run_sync(self._async_find_design_patterns(search_string, body, starts_with, ends_with, ignore_case, start_from, page_size, graph_query_depth, output_format, report_spec, **kwargs)) @@ -290,8 +280,7 @@ def get_design_patterns_by_name(self, name: Optional[str] = None, body: Optional start_from: int = 0, page_size: int = max_paging_size, graph_query_depth: int = 3, output_format: str = "JSON", report_spec: str | dict = "Design-Pattern-DrE", **kwargs): """Get design patterns by name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_design_patterns_by_name(name=name, body=body, start_from=start_from, page_size=page_size, + return run_sync(self._async_get_design_patterns_by_name(name=name, body=body, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -315,8 +304,7 @@ async def _async_get_design_pattern_by_guid(self, guid: str = None, body: Option def get_design_pattern_by_guid(self, guid: str = None, body: Optional[dict | GetRequestBody] = None, graph_query_depth: int = 3, output_format: str = "JSON", report_spec: str | dict = "Design-Pattern-DrE", **kwargs): """Get a design pattern by GUID.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_design_pattern_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) + return run_sync(self._async_get_design_pattern_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) async def _async_update_solution_blueprint_status(self, guid: str, body: dict | UpdateElementRequestBody): validate_guid(guid) @@ -325,8 +313,7 @@ async def _async_update_solution_blueprint_status(self, guid: str, body: dict | def update_solution_blueprint_status(self, guid: str, body: dict | UpdateElementRequestBody): """Update the status of a solution blueprint.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_update_solution_blueprint_status(guid, body)) + return run_sync(self._async_update_solution_blueprint_status(guid, body)) def _get_supply_chain_rel_elements_dict(self, el_struct: dict)-> dict | str: @@ -991,8 +978,7 @@ def create_info_supply_chain(self, body: dict | NewElementRequestBody) -> str: } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_info_supply_chain(body)) + response = run_sync(self._async_create_info_supply_chain(body)) return response @dynamic_catch @@ -1154,8 +1140,7 @@ def create_info_supply_chain_from_template(self, body: dict| TemplateRequestBody """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_info_supply_chain_from_template(body)) + response = run_sync(self._async_create_info_supply_chain_from_template(body)) return response @dynamic_catch @@ -1273,8 +1258,7 @@ def update_info_supply_chain(self, guid: str, body: dict | UpdateElementRequestB } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_info_supply_chain(guid, body)) + run_sync(self._async_update_info_supply_chain(guid, body)) @dynamic_catch async def _async_link_peer_info_supply_chains(self, peer1_guid: str, peer2_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: @@ -1379,8 +1363,7 @@ def link_peer_info_supply_chains(self, peer1_guid: str, peer2_guid: str, body: d } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_peer_info_supply_chains(peer1_guid, peer2_guid, body)) + run_sync(self._async_link_peer_info_supply_chains(peer1_guid, peer2_guid, body)) @dynamic_catch async def _async_unlink_peer_info_supply_chains(self, peer1_guid: str, peer2_guid: str, @@ -1475,8 +1458,7 @@ def unlink_peer_info_supply_chains(self, peer1_guid: str, peer2_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_unlink_peer_info_supply_chains(peer1_guid,peer2_guid, body)) + run_sync(self._async_unlink_peer_info_supply_chains(peer1_guid,peer2_guid, body)) @dynamic_catch async def _async_delete_info_supply_chain(self, guid: str, body: Optional[dict | DeleteElementRequestBody] = None, cascade_delete: bool = False) -> None: @@ -1563,8 +1545,7 @@ def delete_info_supply_chain(self, guid: str, body: dict | DeleteElementRequestB "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_info_supply_chain(guid, body, cascade_delete)) + run_sync(self._async_delete_info_supply_chain(guid, body, cascade_delete)) def find_all_information_supply_chains(self, add_implementation: bool = True, starts_with: bool = True, ends_with: bool = False, @@ -1949,8 +1930,7 @@ def find_information_supply_chains( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_information_supply_chains( search_string=search_string, add_implementation=add_implementation, @@ -2109,8 +2089,7 @@ def get_info_supply_chain_by_name(self, name: Optional[str] = None, body: dict = } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_info_supply_chain_by_name(name=name, body=body, add_implementation=add_implementation, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -2235,8 +2214,7 @@ def get_info_supply_chain_by_guid(self, guid: str = None, body: dict = None, add } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_info_supply_chain_by_guid(guid=guid, body=body, + response = run_sync(self._async_get_info_supply_chain_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, add_implementation=add_implementation, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -2498,8 +2476,7 @@ def create_solution_blueprint(self, body: dict | NewElementRequestBody) -> str: """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_solution_blueprint(body)) + response = run_sync(self._async_create_solution_blueprint(body)) return response @dynamic_catch @@ -2658,8 +2635,7 @@ def create_solution_blueprint_from_template(self, body: dict | TemplateRequestBo } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_solution_blueprint_from_template(body)) + response = run_sync(self._async_create_solution_blueprint_from_template(body)) return response @dynamic_catch @@ -2772,8 +2748,7 @@ def update_solution_blueprint(self, guid: str, body: dict | UpdateElementRequest } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_solution_blueprint(guid, body)) + run_sync(self._async_update_solution_blueprint(guid, body)) @dynamic_catch @@ -2877,8 +2852,7 @@ def link_solution_design(self, blueprint_guid: str, element_guid: str, body: dic "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_solution_design(blueprint_guid, element_guid, body)) + run_sync(self._async_link_solution_design(blueprint_guid, element_guid, body)) @dynamic_catch async def _async_detach_solution_design(self, blueprint_guid: str, element_guid: str, @@ -2944,8 +2918,7 @@ def detach_solution_design(self, blueprint_guid: str, element_guid: str, the requesting user is not authorized to issue this request. """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_solution_design(blueprint_guid, element_guid, body)) + run_sync(self._async_detach_solution_design(blueprint_guid, element_guid, body)) @dynamic_catch @@ -3035,8 +3008,7 @@ def delete_solution_blueprint(self, blueprint_guid: str, cascade_delete: bool = "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_solution_blueprint(blueprint_guid, cascade_delete, body)) + run_sync(self._async_delete_solution_blueprint(blueprint_guid, cascade_delete, body)) @@ -3239,8 +3211,7 @@ def find_solution_blueprints( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_solution_blueprints( search_string=search_string, graph_query_depth=graph_query_depth, @@ -3409,8 +3380,7 @@ def get_solution_blueprint_by_guid(self, guid: str = None, body: dict = None, gr } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_solution_blueprint_by_guid(guid=guid, body=body, + response = run_sync(self._async_get_solution_blueprint_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, max_mermaid_node_count=max_mermaid_node_count, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -3553,8 +3523,7 @@ def get_solution_blueprints_by_name(self, name: Optional[str] = None, body: dict } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_solution_blueprints_by_name(name=name, body=body, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -3766,8 +3735,7 @@ def create_solution_component(self, body: dict | NewElementRequestBody) -> str: """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_solution_component(body)) + response = run_sync(self._async_create_solution_component(body)) return response @dynamic_catch @@ -3927,8 +3895,7 @@ def create_solution_component_from_template(self, body: dict| TemplateRequestBod """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_solution_component_from_template(body)) + response = run_sync(self._async_create_solution_component_from_template(body)) return response @dynamic_catch @@ -4043,8 +4010,7 @@ def update_solution_component(self, guid: str, body: dict | UpdateElementRequest } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_solution_component(guid, body)) + run_sync(self._async_update_solution_component(guid, body)) @dynamic_catch async def _async_link_subcomponent(self, component_guid: str, sub_component_guid: str, body: dict | NewRelationshipRequestBody) -> None: @@ -4131,8 +4097,7 @@ def link_subcomponent(self, component_guid: str, sub_component_guid: str, body: "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_subcomponent(component_guid, sub_component_guid, body)) + run_sync(self._async_link_subcomponent(component_guid, sub_component_guid, body)) @dynamic_catch async def _async_detach_sub_component(self, parent_component_guid: str, member_component_guid: str, body: dict |DeleteRelationshipRequestBody = None) -> None: @@ -4224,8 +4189,7 @@ def detach_sub_component(self, parent_component_guid: str, member_component_guid } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_sub_component(parent_component_guid, member_component_guid, body)) + run_sync(self._async_detach_sub_component(parent_component_guid, member_component_guid, body)) @dynamic_catch async def _async_link_solution_linking_wire(self, component1_guid: str, component2_guid: str, body: dict | NewRelationshipRequestBody) -> Optional[str]: @@ -4331,8 +4295,7 @@ def link_solution_linking_wire(self, component1_guid: str, component2_guid: str, "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_link_solution_linking_wire(component1_guid, component2_guid, body)) + return run_sync(self._async_link_solution_linking_wire(component1_guid, component2_guid, body)) @dynamic_catch async def _async_detach_solution_linking_wire(self, component1_guid: str, component2_guid: str, @@ -4436,8 +4399,7 @@ def detach_solution_linking_wire(self, component1_guid: str, component2_guid: st } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_solution_linking_wire(component1_guid, component2_guid, body)) + run_sync(self._async_detach_solution_linking_wire(component1_guid, component2_guid, body)) # # GUID-based SolutionLinkingWire update/detach (Egeria PR #9156, multi-link) -- @@ -4498,8 +4460,7 @@ def update_solution_linking_wire(self, relationship_guid: str, body: dict | UpdateRelationshipRequestBody) -> None: """ Update the properties of one specific SolutionLinkingWire relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_solution_linking_wire(relationship_guid, body)) + run_sync(self._async_update_solution_linking_wire(relationship_guid, body)) @dynamic_catch async def _async_detach_solution_linking_wire_by_guid(self, relationship_guid: str, @@ -4548,8 +4509,7 @@ def detach_solution_linking_wire_by_guid(self, relationship_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """ Detach one specific SolutionLinkingWire relationship, identified by its own relationship GUID.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_solution_linking_wire_by_guid(relationship_guid, body)) + run_sync(self._async_detach_solution_linking_wire_by_guid(relationship_guid, body)) @dynamic_catch async def _async_delete_solution_component(self, solution_component_guid: str, cascade_delete: bool = False, @@ -4637,8 +4597,7 @@ def delete_solution_component(self, solution_component_guid: str, cascade_delete "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_solution_component(solution_component_guid, cascade_delete, body)) + run_sync(self._async_delete_solution_component(solution_component_guid, cascade_delete, body)) async def _async_find_solution_components( self, @@ -4837,8 +4796,7 @@ def find_solution_components( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_find_solution_components( search_string=search_string, graph_query_depth=graph_query_depth, @@ -5020,8 +4978,7 @@ def get_solution_components_by_name(self, name: Optional[str] = None, body: dict report_spec (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_solution_components_by_name(name=name, body=body, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -5141,8 +5098,7 @@ def get_solution_component_by_guid(self, guid: str = None, body: dict = None, gr } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_solution_component_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -5339,8 +5295,7 @@ def get_solution_component_implementations(self, guid: str = None, body: dict = } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_solution_component_implementations(guid=guid, body=body, start_from=start_from, page_size=page_size, output_format=output_format, **kwargs)) return response @@ -5487,8 +5442,7 @@ def create_solution_role(self, body: dict| NewElementRequestBody) -> str: """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_solution_role(body)) + response = run_sync(self._async_create_solution_role(body)) return response @dynamic_catch @@ -5648,8 +5602,7 @@ def create_solution_role_from_template(self, body: dict |TemplateRequestBody) -> """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_create_solution_role_from_template(body)) + response = run_sync(self._async_create_solution_role_from_template(body)) return response @dynamic_catch @@ -5767,8 +5720,7 @@ def update_solution_role(self, guid: str, body: dict | UpdateElementRequestBody) "forDuplicateProcessing" : false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_solution_role(guid, body)) + run_sync(self._async_update_solution_role(guid, body)) @dynamic_catch async def _async_link_component_to_actor(self, role_guid: str, component_guid: str, body: dict | NewRelationshipRequestBody) -> None: @@ -5870,8 +5822,7 @@ def link_component_to_actor(self, role_guid: str, component_guid: str, body: dic } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_component_to_actor(role_guid, component_guid, body)) + run_sync(self._async_link_component_to_actor(role_guid, component_guid, body)) @dynamic_catch async def _async_detach_component_actor(self, role_guid: str, component_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -5961,8 +5912,7 @@ def detach_component_actore(self, role_guid: str, component_guid: str, body: dic "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_component_actor(role_guid, component_guid, body)) + run_sync(self._async_detach_component_actor(role_guid, component_guid, body)) @dynamic_catch async def _async_delete_solution_role(self, guid: str, body: dict | DeleteElementRequestBody= None, cascade_delete: bool = False,) -> None: @@ -6050,8 +6000,7 @@ def delete_solution_role(self, guid: str, body: Optional[dict | DeleteElementReq "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_solution_role(guid, body, cascade_delete)) + run_sync(self._async_delete_solution_role(guid, body, cascade_delete)) async def _async_find_solution_roles( @@ -6287,8 +6236,7 @@ def find_solution_roles( } """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_solution_roles( search_string=search_string, graph_query_depth=graph_query_depth, @@ -6468,8 +6416,7 @@ def get_solution_roles_by_name(self, name: Optional[str] = None, body: dict = No } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_solution_roles_by_name(name=name, body=body, start_from=start_from, page_size=page_size, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -6583,8 +6530,7 @@ def get_solution_role_by_guid(self, guid: str = None, body: dict = None, graph_q } """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete(self._async_get_solution_role_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) + response = run_sync(self._async_get_solution_role_by_guid(guid=guid, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) return response @@ -6635,8 +6581,7 @@ async def _async_create_concept_model_element(self, body: dict | NewElementReque @dynamic_catch def create_concept_model_element(self, body: dict | NewElementRequestBody) -> str: """Create a new concept model element (e.g. a ConceptBead).""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_concept_model_element(body)) + return run_sync(self._async_create_concept_model_element(body)) @dynamic_catch async def _async_create_concept_model_element_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -6647,8 +6592,7 @@ async def _async_create_concept_model_element_from_template(self, body: dict | T @dynamic_catch def create_concept_model_element_from_template(self, body: dict | TemplateRequestBody) -> str: """Create a new concept model element from a template.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_concept_model_element_from_template(body)) + return run_sync(self._async_create_concept_model_element_from_template(body)) @dynamic_catch async def _async_update_concept_model_element(self, guid: str, body: dict | UpdateElementRequestBody) -> None: @@ -6662,8 +6606,7 @@ async def _async_update_concept_model_element(self, guid: str, body: dict | Upda @dynamic_catch def update_concept_model_element(self, guid: str, body: dict | UpdateElementRequestBody) -> None: """Update the properties of a concept model element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_concept_model_element(guid, body)) + run_sync(self._async_update_concept_model_element(guid, body)) @dynamic_catch async def _async_delete_concept_model_element(self, guid: str, body: Optional[dict | DeleteElementRequestBody] = None, @@ -6677,8 +6620,7 @@ async def _async_delete_concept_model_element(self, guid: str, body: Optional[di def delete_concept_model_element(self, guid: str, body: Optional[dict | DeleteElementRequestBody] = None, cascade_delete: bool = False) -> None: """Delete a concept model element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_concept_model_element(guid, body, cascade_delete)) + run_sync(self._async_delete_concept_model_element(guid, body, cascade_delete)) @dynamic_catch async def _async_find_concept_model_elements(self, search_string: str = "*", @@ -6703,8 +6645,7 @@ def find_concept_model_elements(self, search_string: str = "*", output_format: str = "JSON", report_spec: str | dict | None = None, **kwargs) -> list | str: """Find concept model elements matching a search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_find_concept_model_elements( + return run_sync(self._async_find_concept_model_elements( search_string, body, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, **kwargs)) @@ -6728,8 +6669,7 @@ def get_concept_model_elements_by_name(self, name: str | None = None, output_format: str = "JSON", report_spec: str | dict | None = None, **kwargs) -> list | str: """Return the concept model elements with a specific name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_concept_model_elements_by_name( + return run_sync(self._async_get_concept_model_elements_by_name( name, body, start_from, page_size, output_format, report_spec, **kwargs)) @dynamic_catch @@ -6748,8 +6688,7 @@ def get_concept_model_element_by_guid(self, guid: str, body: Optional[dict | Get output_format: str = "JSON", report_spec: str | dict | None = None, **kwargs) -> dict | str: """Return the properties of a specific concept model element.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_get_concept_model_element_by_guid( + return run_sync(self._async_get_concept_model_element_by_guid( guid, body, output_format, report_spec, **kwargs)) @dynamic_catch @@ -6763,8 +6702,7 @@ async def _async_link_concept_design(self, element_guid: str, concept_model_guid def link_concept_design(self, element_guid: str, concept_model_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach an element to the concept model element that designs it (ConceptDesign relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_concept_design(element_guid, concept_model_guid, body)) + run_sync(self._async_link_concept_design(element_guid, concept_model_guid, body)) @dynamic_catch async def _async_detach_concept_design(self, element_guid: str, concept_model_guid: str, @@ -6777,8 +6715,7 @@ async def _async_detach_concept_design(self, element_guid: str, concept_model_gu def detach_concept_design(self, element_guid: str, concept_model_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach an element from a concept model element.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_concept_design(element_guid, concept_model_guid, body)) + run_sync(self._async_detach_concept_design(element_guid, concept_model_guid, body)) @dynamic_catch async def _async_link_concept_bead_relationship_end(self, concept_bead_relationship_guid: str, concept_bead_guid: str, @@ -6791,8 +6728,7 @@ async def _async_link_concept_bead_relationship_end(self, concept_bead_relations def link_concept_bead_relationship_end(self, concept_bead_relationship_guid: str, concept_bead_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a concept bead as one end of a concept bead relationship (ConceptBeadRelationshipEnd relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_concept_bead_relationship_end(concept_bead_relationship_guid, concept_bead_guid, body)) + run_sync(self._async_link_concept_bead_relationship_end(concept_bead_relationship_guid, concept_bead_guid, body)) @dynamic_catch async def _async_detach_concept_bead_relationship_end(self, concept_bead_relationship_guid: str, concept_bead_guid: str, @@ -6805,8 +6741,7 @@ async def _async_detach_concept_bead_relationship_end(self, concept_bead_relatio def detach_concept_bead_relationship_end(self, concept_bead_relationship_guid: str, concept_bead_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a concept bead from a concept bead relationship.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_concept_bead_relationship_end(concept_bead_relationship_guid, concept_bead_guid, body)) + run_sync(self._async_detach_concept_bead_relationship_end(concept_bead_relationship_guid, concept_bead_guid, body)) @dynamic_catch async def _async_link_typed_by_concept_bead(self, concept_bead_attribute_guid: str, concept_bead_guid: str, @@ -6819,8 +6754,7 @@ async def _async_link_typed_by_concept_bead(self, concept_bead_attribute_guid: s def link_typed_by_concept_bead(self, concept_bead_attribute_guid: str, concept_bead_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a concept bead attribute to the concept bead that types it (TypedByConceptBead relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_typed_by_concept_bead(concept_bead_attribute_guid, concept_bead_guid, body)) + run_sync(self._async_link_typed_by_concept_bead(concept_bead_attribute_guid, concept_bead_guid, body)) @dynamic_catch async def _async_detach_typed_by_concept_bead(self, concept_bead_attribute_guid: str, concept_bead_guid: str, @@ -6833,8 +6767,7 @@ async def _async_detach_typed_by_concept_bead(self, concept_bead_attribute_guid: def detach_typed_by_concept_bead(self, concept_bead_attribute_guid: str, concept_bead_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a concept bead attribute from the concept bead that types it.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_typed_by_concept_bead(concept_bead_attribute_guid, concept_bead_guid, body)) + run_sync(self._async_detach_typed_by_concept_bead(concept_bead_attribute_guid, concept_bead_guid, body)) @dynamic_catch async def _async_link_is_a_concept_bead(self, concept_bead_guid: str, general_concept_bead_guid: str, @@ -6847,8 +6780,7 @@ async def _async_link_is_a_concept_bead(self, concept_bead_guid: str, general_co def link_is_a_concept_bead(self, concept_bead_guid: str, general_concept_bead_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a concept bead to the more general concept bead it is a kind of (IsAConceptBead relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_is_a_concept_bead(concept_bead_guid, general_concept_bead_guid, body)) + run_sync(self._async_link_is_a_concept_bead(concept_bead_guid, general_concept_bead_guid, body)) @dynamic_catch async def _async_detach_is_a_concept_bead(self, concept_bead_guid: str, general_concept_bead_guid: str, @@ -6861,8 +6793,7 @@ async def _async_detach_is_a_concept_bead(self, concept_bead_guid: str, general_ def detach_is_a_concept_bead(self, concept_bead_guid: str, general_concept_bead_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a concept bead from a more general concept bead.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_is_a_concept_bead(concept_bead_guid, general_concept_bead_guid, body)) + run_sync(self._async_detach_is_a_concept_bead(concept_bead_guid, general_concept_bead_guid, body)) @dynamic_catch async def _async_link_concept_bead_attribute_link(self, concept_bead_guid: str, concept_bead_attribute_guid: str, @@ -6875,8 +6806,7 @@ async def _async_link_concept_bead_attribute_link(self, concept_bead_guid: str, def link_concept_bead_attribute_link(self, concept_bead_guid: str, concept_bead_attribute_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach an attribute to the concept bead it belongs to (ConceptBeadAttributeLink relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_concept_bead_attribute_link(concept_bead_guid, concept_bead_attribute_guid, body)) + run_sync(self._async_link_concept_bead_attribute_link(concept_bead_guid, concept_bead_attribute_guid, body)) @dynamic_catch async def _async_detach_concept_bead_attribute_link(self, concept_bead_guid: str, concept_bead_attribute_guid: str, @@ -6889,8 +6819,7 @@ async def _async_detach_concept_bead_attribute_link(self, concept_bead_guid: str def detach_concept_bead_attribute_link(self, concept_bead_guid: str, concept_bead_attribute_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach an attribute from the concept bead it belongs to.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_concept_bead_attribute_link(concept_bead_guid, concept_bead_attribute_guid, body)) + run_sync(self._async_detach_concept_bead_attribute_link(concept_bead_guid, concept_bead_attribute_guid, body)) @dynamic_catch async def _async_link_concept_bead_extension(self, concept_bead_guid: str, extension_concept_bead_guid: str, @@ -6903,8 +6832,7 @@ async def _async_link_concept_bead_extension(self, concept_bead_guid: str, exten def link_concept_bead_extension(self, concept_bead_guid: str, extension_concept_bead_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a concept bead to another concept bead that extends it (ConceptBeadExtension relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_concept_bead_extension(concept_bead_guid, extension_concept_bead_guid, body)) + run_sync(self._async_link_concept_bead_extension(concept_bead_guid, extension_concept_bead_guid, body)) @dynamic_catch async def _async_detach_concept_bead_extension(self, concept_bead_guid: str, extension_concept_bead_guid: str, @@ -6917,8 +6845,7 @@ async def _async_detach_concept_bead_extension(self, concept_bead_guid: str, ext def detach_concept_bead_extension(self, concept_bead_guid: str, extension_concept_bead_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a concept bead extension.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_concept_bead_extension(concept_bead_guid, extension_concept_bead_guid, body)) + run_sync(self._async_detach_concept_bead_extension(concept_bead_guid, extension_concept_bead_guid, body)) # # Solution ports (ISSUE-85; Egeria added these endpoints 2026-09-06) @@ -6936,8 +6863,7 @@ def create_solution_port(self, body: dict | NewElementRequestBody) -> str: """Create a solution port, with SolutionPortProperties (which adds `direction`: UNKNOWN, INPUT, OUTPUT or INOUT to the design model element properties). Attach it to its component with link_solution_component_port.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_solution_port(body)) + return run_sync(self._async_create_solution_port(body)) @dynamic_catch async def _async_create_solution_port_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -6948,8 +6874,7 @@ async def _async_create_solution_port_from_template(self, body: dict | TemplateR @dynamic_catch def create_solution_port_from_template(self, body: dict | TemplateRequestBody) -> str: """Create a solution port from a template.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_solution_port_from_template(body)) + return run_sync(self._async_create_solution_port_from_template(body)) @dynamic_catch async def _async_update_solution_port(self, solution_port_guid: str, @@ -6961,8 +6886,7 @@ async def _async_update_solution_port(self, solution_port_guid: str, @dynamic_catch def update_solution_port(self, solution_port_guid: str, body: dict | UpdateElementRequestBody) -> None: """Update the properties of a solution port.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_solution_port(solution_port_guid, body)) + run_sync(self._async_update_solution_port(solution_port_guid, body)) @dynamic_catch async def _async_delete_solution_port(self, solution_port_guid: str, cascade_delete: bool = False, @@ -6975,8 +6899,7 @@ async def _async_delete_solution_port(self, solution_port_guid: str, cascade_del def delete_solution_port(self, solution_port_guid: str, cascade_delete: bool = False, body: Optional[dict | DeleteElementRequestBody] = None) -> None: """Delete a solution port.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_solution_port(solution_port_guid, cascade_delete, body)) + run_sync(self._async_delete_solution_port(solution_port_guid, cascade_delete, body)) @dynamic_catch async def _async_find_solution_ports(self, search_string: str = "*", @@ -7005,8 +6928,7 @@ def find_solution_ports(self, search_string: str = "*", output_format: str = "JSON", report_spec: str | dict = None, **kwargs) -> list[dict] | str: """Retrieve the solution ports whose properties contain the search string.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_solution_ports(search_string, body, starts_with, ends_with, ignore_case, start_from, page_size, graph_query_depth, output_format, report_spec, **kwargs)) @@ -7033,8 +6955,7 @@ def get_solution_ports_by_name(self, name: str | None = None, graph_query_depth: int = 3, output_format: str = "JSON", report_spec: str | dict = None, **kwargs) -> list | str: """Retrieve the solution ports with a particular name.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_solution_ports_by_name(name, body, start_from, page_size, graph_query_depth, output_format, report_spec, **kwargs)) @@ -7055,8 +6976,7 @@ def get_solution_port_by_guid(self, solution_port_guid: str, body: Optional[dict graph_query_depth: int = 3, output_format: str = "JSON", report_spec: str | dict = None, **kwargs) -> dict | str: """Return the properties of a specific solution port.""" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_solution_port_by_guid(solution_port_guid, body, graph_query_depth, output_format, report_spec, **kwargs)) @@ -7071,8 +6991,7 @@ async def _async_link_solution_component_port(self, solution_component_guid: str def link_solution_component_port(self, solution_component_guid: str, solution_port_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a solution port to the solution component it belongs to (SolutionComponentPort relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_solution_component_port(solution_component_guid, solution_port_guid, body)) + run_sync(self._async_link_solution_component_port(solution_component_guid, solution_port_guid, body)) @dynamic_catch async def _async_detach_solution_component_port(self, solution_component_guid: str, solution_port_guid: str, @@ -7085,8 +7004,7 @@ async def _async_detach_solution_component_port(self, solution_component_guid: s def detach_solution_component_port(self, solution_component_guid: str, solution_port_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a solution port from a solution component.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_solution_component_port(solution_component_guid, solution_port_guid, body)) + run_sync(self._async_detach_solution_component_port(solution_component_guid, solution_port_guid, body)) @dynamic_catch async def _async_link_solution_port_delegation(self, aligns_to_port_guid: str, delegation_port_guid: str, @@ -7099,8 +7017,7 @@ async def _async_link_solution_port_delegation(self, aligns_to_port_guid: str, d def link_solution_port_delegation(self, aligns_to_port_guid: str, delegation_port_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a solution port to the port it delegates to (PortDelegation relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_solution_port_delegation(aligns_to_port_guid, delegation_port_guid, body)) + run_sync(self._async_link_solution_port_delegation(aligns_to_port_guid, delegation_port_guid, body)) @dynamic_catch async def _async_detach_solution_port_delegation(self, aligns_to_port_guid: str, delegation_port_guid: str, @@ -7113,8 +7030,7 @@ async def _async_detach_solution_port_delegation(self, aligns_to_port_guid: str, def detach_solution_port_delegation(self, aligns_to_port_guid: str, delegation_port_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a solution port delegation.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_solution_port_delegation(aligns_to_port_guid, delegation_port_guid, body)) + run_sync(self._async_detach_solution_port_delegation(aligns_to_port_guid, delegation_port_guid, body)) diff --git a/pyegeria/omvs/subject_area.py b/pyegeria/omvs/subject_area.py index d3404d7d..8ccf6bc7 100644 --- a/pyegeria/omvs/subject_area.py +++ b/pyegeria/omvs/subject_area.py @@ -29,6 +29,7 @@ overlay_additional_values, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class SubjectAreaProperties(ReferenceableProperties): @@ -176,8 +177,7 @@ def create_subject_area(self, body: dict | NewElementRequestBody) -> str: } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_subject_area(body)) + return run_sync(self._async_create_subject_area(body)) @dynamic_catch async def _async_create_subject_area_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -259,8 +259,7 @@ def create_subject_area_from_template(self, body: dict | TemplateRequestBody) -> } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_subject_area_from_template(body)) + return run_sync(self._async_create_subject_area_from_template(body)) @dynamic_catch async def _async_update_subject_area( @@ -334,8 +333,7 @@ def update_subject_area(self, subject_area_guid: str, body: dict | UpdateElement } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_subject_area(subject_area_guid, body)) + run_sync(self._async_update_subject_area(subject_area_guid, body)) @dynamic_catch async def _async_delete_subject_area( @@ -401,8 +399,7 @@ def delete_subject_area(self, subject_area_guid: str, body: dict | DeleteElement } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_subject_area(subject_area_guid, body)) + run_sync(self._async_delete_subject_area(subject_area_guid, body)) @dynamic_catch async def _async_link_subject_area_hierarchy( @@ -484,8 +481,7 @@ def link_subject_area_hierarchy( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_subject_area_hierarchy( parent_subject_area_guid, nested_subject_area_guid, body ) @@ -565,8 +561,7 @@ def detach_subject_area_hierarchy( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_subject_area_hierarchy( parent_subject_area_guid, nested_subject_area_guid, body ) @@ -722,8 +717,7 @@ def get_subject_areas_by_name( if name is None and body is None: name = "*" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_subject_areas_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -901,8 +895,7 @@ def find_subject_areas( ------- list | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_subject_areas( search_string=search_string, starts_with=starts_with, @@ -1025,8 +1018,7 @@ def get_subject_area_by_guid( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_subject_area_by_guid( guid=guid, include_only_relationships=include_only_relationships, @@ -1056,8 +1048,7 @@ async def _async_link_subject_areas(self, parent_subject_area_guid: str, nested_ def link_subject_areas(self, parent_subject_area_guid: str, nested_subject_area_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a nested subject area to its parent subject area (SubjectAreaHierarchy relationship).""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_subject_areas(parent_subject_area_guid, nested_subject_area_guid, body)) + run_sync(self._async_link_subject_areas(parent_subject_area_guid, nested_subject_area_guid, body)) @dynamic_catch async def _async_detach_subject_areas(self, parent_subject_area_guid: str, nested_subject_area_guid: str, @@ -1070,5 +1061,4 @@ async def _async_detach_subject_areas(self, parent_subject_area_guid: str, neste def detach_subject_areas(self, parent_subject_area_guid: str, nested_subject_area_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a nested subject area from its parent subject area.""" - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_detach_subject_areas(parent_subject_area_guid, nested_subject_area_guid, body)) + run_sync(self._async_detach_subject_areas(parent_subject_area_guid, nested_subject_area_guid, body)) diff --git a/pyegeria/omvs/template_manager_omvs.py b/pyegeria/omvs/template_manager_omvs.py index a39f2c5c..f435e3d7 100644 --- a/pyegeria/omvs/template_manager_omvs.py +++ b/pyegeria/omvs/template_manager_omvs.py @@ -14,6 +14,7 @@ from pyegeria.core.utils import dynamic_catch from pyegeria.models import (NewRelationshipRequestBody, DeleteRelationshipRequestBody, NewClassificationRequestBody, DeleteClassificationRequestBody) +from pyegeria.core.async_runner import run_sync class TemplateManager(ServerClient): @@ -87,7 +88,7 @@ async def _async_link_sourced_from(self, element_guid: str, template_guid: str, @dynamic_catch def link_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a template to an element that was created from it.""" - return asyncio.get_event_loop().run_until_complete(self._async_link_sourced_from(element_guid, template_guid, body)) + return run_sync(self._async_link_sourced_from(element_guid, template_guid, body)) @dynamic_catch async def _async_detach_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -109,7 +110,7 @@ async def _async_detach_sourced_from(self, element_guid: str, template_guid: str @dynamic_catch def detach_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach the source template for an element.""" - return asyncio.get_event_loop().run_until_complete(self._async_detach_sourced_from(element_guid, template_guid, body)) + return run_sync(self._async_detach_sourced_from(element_guid, template_guid, body)) @dynamic_catch async def _async_link_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: @@ -131,7 +132,7 @@ async def _async_link_catalog_template(self, element_guid: str, template_guid: s @dynamic_catch def link_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None: """Attach a template to an element that was created from it.""" - return asyncio.get_event_loop().run_until_complete(self._async_link_catalog_template(element_guid, template_guid, body)) + return run_sync(self._async_link_catalog_template(element_guid, template_guid, body)) @dynamic_catch async def _async_detach_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: @@ -153,7 +154,7 @@ async def _async_detach_catalog_template(self, element_guid: str, template_guid: @dynamic_catch def detach_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None: """Detach a template for an element that this template is relevant to.""" - return asyncio.get_event_loop().run_until_complete(self._async_detach_catalog_template(element_guid, template_guid, body)) + return run_sync(self._async_detach_catalog_template(element_guid, template_guid, body)) @dynamic_catch async def _async_add_template_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: @@ -173,7 +174,7 @@ async def _async_add_template_classification(self, element_guid: str, body: Opti @dynamic_catch def add_template_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as suitable to be used as a template for cataloguing elements of similar types.""" - return asyncio.get_event_loop().run_until_complete(self._async_add_template_classification(element_guid, body)) + return run_sync(self._async_add_template_classification(element_guid, body)) @dynamic_catch async def _async_remove_template_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: @@ -193,7 +194,7 @@ async def _async_remove_template_classification(self, element_guid: str, body: O @dynamic_catch def remove_template_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the Template classification from the element.""" - return asyncio.get_event_loop().run_until_complete(self._async_remove_template_classification(element_guid, body)) + return run_sync(self._async_remove_template_classification(element_guid, body)) @dynamic_catch async def _async_add_template_substitute_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: @@ -213,7 +214,7 @@ async def _async_add_template_substitute_classification(self, element_guid: str, @dynamic_catch def add_template_substitute_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None: """Classify an element as suitable to be used as a template substitute for cataloguing elements of similar types.""" - return asyncio.get_event_loop().run_until_complete(self._async_add_template_substitute_classification(element_guid, body)) + return run_sync(self._async_add_template_substitute_classification(element_guid, body)) @dynamic_catch async def _async_remove_template_substitute_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: @@ -233,4 +234,4 @@ async def _async_remove_template_substitute_classification(self, element_guid: s @dynamic_catch def remove_template_substitute_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None: """Remove the TemplateSubstitute classification from the element.""" - return asyncio.get_event_loop().run_until_complete(self._async_remove_template_substitute_classification(element_guid, body)) + return run_sync(self._async_remove_template_substitute_classification(element_guid, body)) diff --git a/pyegeria/omvs/time_keeper.py b/pyegeria/omvs/time_keeper.py index b7ddbd6f..936a7da7 100644 --- a/pyegeria/omvs/time_keeper.py +++ b/pyegeria/omvs/time_keeper.py @@ -30,6 +30,7 @@ overlay_additional_values, ) from pyegeria.core.utils import dynamic_catch +from pyegeria.core.async_runner import run_sync class ContextEventProperties(ReferenceableProperties): @@ -216,8 +217,7 @@ def create_context_event(self, body: dict | NewElementRequestBody) -> str: } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_context_event(body)) + return run_sync(self._async_create_context_event(body)) @dynamic_catch async def _async_create_context_event_from_template(self, body: dict | TemplateRequestBody) -> str: @@ -299,8 +299,7 @@ def create_context_event_from_template(self, body: dict | TemplateRequestBody) - } ``` """ - loop = asyncio.get_event_loop() - return loop.run_until_complete(self._async_create_context_event_from_template(body)) + return run_sync(self._async_create_context_event_from_template(body)) @dynamic_catch async def _async_update_context_event( @@ -374,8 +373,7 @@ def update_context_event(self, context_event_guid: str, body: dict | UpdateEleme } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_update_context_event(context_event_guid, body)) + run_sync(self._async_update_context_event(context_event_guid, body)) @dynamic_catch async def _async_delete_context_event( @@ -443,8 +441,7 @@ def delete_context_event(self, context_event_guid: str, body: dict | DeleteEleme } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_delete_context_event(context_event_guid, body)) + run_sync(self._async_delete_context_event(context_event_guid, body)) @dynamic_catch async def _async_link_dependent_context_events( @@ -530,8 +527,7 @@ def link_dependent_context_events( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_dependent_context_events( parent_context_event_guid, child_context_event_guid, body ) @@ -615,8 +611,7 @@ def detach_dependent_context_events( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_dependent_context_events( parent_context_event_guid, child_context_event_guid, body ) @@ -706,8 +701,7 @@ def link_related_context_events( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_related_context_events(context_event_one_guid, context_event_two_guid, body) ) @@ -789,8 +783,7 @@ def detach_related_context_events( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_related_context_events(context_event_one_guid, context_event_two_guid, body) ) @@ -872,8 +865,7 @@ def link_context_event_evidence( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_context_event_evidence(context_event_guid, evidence_guid, body) ) @@ -949,8 +941,7 @@ def detach_context_event_evidence( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_context_event_evidence(context_event_guid, evidence_guid, body) ) @@ -1032,8 +1023,7 @@ def link_context_event_impact( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_context_event_impact(context_event_guid, impacted_element_guid, body) ) @@ -1109,8 +1099,7 @@ def detach_context_event_impact( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_context_event_impact(context_event_guid, impacted_element_guid, body) ) @@ -1198,8 +1187,7 @@ def link_context_event_timeline_effect( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_link_context_event_timeline_effect( timeline_affected_element_guid, context_event_guid, body ) @@ -1283,8 +1271,7 @@ def detach_context_event_timeline_effect( } ``` """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_context_event_timeline_effect( timeline_affected_element_guid, context_event_guid, body ) @@ -1440,8 +1427,7 @@ def get_context_events_by_name( if name is None and body is None: name = "*" - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_context_events_by_name( name=name, metadata_element_type_name=metadata_element_type_name, @@ -1619,8 +1605,7 @@ def find_context_events( ------- List | str """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_context_events( search_string=search_string, starts_with=starts_with, @@ -1743,8 +1728,7 @@ def get_context_event_by_guid( PyegeriaException If there are issues in communications, message format, or Egeria errors. """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_get_context_event_by_guid( guid=guid, include_only_relationships=include_only_relationships, diff --git a/pyegeria/omvs/valid_metadata.py b/pyegeria/omvs/valid_metadata.py index c02ca843..5ae7ae6f 100644 --- a/pyegeria/omvs/valid_metadata.py +++ b/pyegeria/omvs/valid_metadata.py @@ -22,6 +22,7 @@ populate_columns_from_properties, get_required_relationships, ) +from pyegeria.core.async_runner import run_sync class ValidMetadataManager(ServerClient): @@ -370,8 +371,7 @@ def setup_valid_metadata_value( } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_setup_valid_metadata_value(property_name, type_name, body) ) return @@ -487,8 +487,7 @@ def setup_valid_metadata_map_name( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_setup_valid_metadata_map_name(property_name, type_name, body) ) return @@ -604,8 +603,7 @@ def setup_valid_metadata_map_value( "isCaseSensitive": false, } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_setup_valid_metadata_map_value( property_name, map_name, type_name, body ) @@ -680,8 +678,7 @@ def clear_valid_metadata_value( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_valid_metadata_value( property_name, type_name, preferred_value ) @@ -762,8 +759,7 @@ def clear_valid_metadata_map_name( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_valid_metadata_map_name( property_name, type_name, map_name ) @@ -832,8 +828,7 @@ def clear_valid_metadata_map_value( """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_clear_valid_metadata_map_value( property_name, type_name, map_name, preferred_value ) @@ -908,8 +903,7 @@ def validate_metadata_value( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_validate_metadata_value( property_name, type_name, actual_value ) @@ -984,8 +978,7 @@ def validate_metadata_map_name( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_validate_metadata_map_name(property_name, type_name, map_name) ) return response @@ -1062,8 +1055,7 @@ def validate_metadata_map_value( """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_validate_metadata_map_value( property_name, type_name, map_name, actual_value ) @@ -1157,8 +1149,7 @@ def get_valid_metadata_value( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_valid_metadata_value( property_name, type_name, preferred_value, output_format=output_format, report_spec=report_spec ) @@ -1252,8 +1243,7 @@ def get_valid_metadata_map_name( PyegeriaException """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_valid_metadata_map_name(property_name, type_name, map_name, output_format=output_format, report_spec=report_spec) ) @@ -1352,8 +1342,7 @@ def get_valid_metadata_map_value( map_name (): """ - loop = asyncio.get_event_loop() - response = loop.run_until_complete( + response = run_sync( self._async_get_valid_metadata_map_value(property_name, type_name, preferred_value, map_name, output_format=output_format, report_spec=report_spec) ) @@ -1473,8 +1462,7 @@ def get_valid_metadata_values( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_valid_metadata_values( property_name, type_name, start_from, page_size, output_format=output_format, report_spec=report_spec ) @@ -1602,8 +1590,7 @@ def get_consistent_metadata_values( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_consistent_metadata_values( property_name, type_name, @@ -1727,8 +1714,7 @@ def set_consistent_metadata_values( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_set_consistent_metadata_values(property_name1, type_name1, map_name1, preferred_value1, property_name2, type_name2, map_name2, preferred_value2) ) @@ -1822,8 +1808,7 @@ def get_all_entity_types(self, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_get_all_entity_types(get_inherited_attributes=get_inherited_attributes, + resp = run_sync(self._async_get_all_entity_types(get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, output_format=output_format, report_spec=report_spec)) @@ -1907,8 +1892,7 @@ def get_all_entity_defs(self, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_get_all_entity_defs(get_inherited_attributes=get_inherited_attributes, + resp = run_sync(self._async_get_all_entity_defs(get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, output_format=output_format, report_spec=report_spec)) @@ -1992,8 +1976,7 @@ def get_all_relationship_defs(self, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_get_all_relationship_defs(get_inherited_attributes=get_inherited_attributes, + resp = run_sync(self._async_get_all_relationship_defs(get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, output_format=output_format, report_spec=report_spec)) @@ -2077,8 +2060,7 @@ def get_all_classification_defs(self, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_get_all_classification_defs(get_inherited_attributes=get_inherited_attributes, + resp = run_sync(self._async_get_all_classification_defs(get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, output_format=output_format, report_spec=report_spec)) @@ -2151,8 +2133,7 @@ def get_attribute_types(self, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_get_attribute_types(category=category, + resp = run_sync(self._async_get_attribute_types(category=category, output_format=output_format, report_spec=report_spec)) return resp @@ -2245,8 +2226,7 @@ def get_sub_types(self, type_name: str, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_sub_types(type_name, get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, @@ -2338,8 +2318,7 @@ def get_valid_relationship_types(self, entity_type: str, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_valid_relationship_types(entity_type, get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, @@ -2433,8 +2412,7 @@ def get_valid_classification_types(self, entity_type: str, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete( + resp = run_sync( self._async_get_valid_classification_types(entity_type, get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, @@ -2528,8 +2506,7 @@ def get_typedef_by_name(self, name: str = None, PyegeriaException """ - loop = asyncio.get_event_loop() - resp = loop.run_until_complete(self._async_get_typedef_by_name(name=name, + resp = run_sync(self._async_get_typedef_by_name(name=name, get_inherited_attributes=get_inherited_attributes, get_relationship_attributes=get_relationship_attributes, output_format=output_format, @@ -2650,8 +2627,7 @@ def setup_specification_property(self, element_guid: str, body: dict): } } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_setup_specification_property(element_guid, body) ) @@ -2735,8 +2711,7 @@ def delete_specification_property(self, spec_property_guid: str, body: dict | De "forDuplicateProcessing": false } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_delete_specification_property(spec_property_guid, body, cascade) ) @@ -2825,8 +2800,7 @@ def link_specification_property( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete(self._async_link_specification_property(element_guid, vv_def_guid, body)) + run_sync(self._async_link_specification_property(element_guid, vv_def_guid, body)) @dynamic_catch async def _async_detach_specification_property( @@ -2913,8 +2887,7 @@ def detach_specification_property( } """ - loop = asyncio.get_event_loop() - loop.run_until_complete( + run_sync( self._async_detach_specification_property(element_guid, vv_def_guid, body, cascade_delete)) @dynamic_catch @@ -3115,8 +3088,7 @@ def find_specification_property( The principle specified by the user_id does not have authorization for the requested action """ - loop = asyncio.get_event_loop() - return loop.run_until_complete( + return run_sync( self._async_find_specification_property( search_string=search_string, graph_query_depth=graph_query_depth, @@ -3251,7 +3223,7 @@ def get_specification_property_by_type(self, spec_property_type:str, body: Optio "sequencingProperty": "" } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_specification_property_by_type(spec_property_type, body, start_from, page_size, output_format, report_spec)) @dynamic_catch @@ -3378,7 +3350,7 @@ def get_specification_property_by_name(self, name: Optional[str] = None, start_f """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_specification_property_by_name(name=name, start_from=start_from, page_size=page_size, category=category, classification_names=classification_names, graph_query_depth=graph_query_depth, @@ -3487,7 +3459,7 @@ def get_specification_property_by_guid(self, guid: str = None, element_type: Opt "forDuplicateProcessing": false } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_specification_property_by_guid(guid=guid, element_type=element_type, body=body, graph_query_depth=graph_query_depth, output_format=output_format, report_spec=report_spec, **kwargs)) @@ -3571,7 +3543,7 @@ def get_specification_property_types(self, output_format: str = 'JSON', report_s "forDuplicateProcessing": false } """ - return asyncio.get_event_loop().run_until_complete( + return run_sync( self._async_get_specification_property_types(output_format, report_spec)) diff --git a/pyegeria/view/mermaid_utilities.py b/pyegeria/view/mermaid_utilities.py index 0553c9ca..e62473ed 100644 --- a/pyegeria/view/mermaid_utilities.py +++ b/pyegeria/view/mermaid_utilities.py @@ -15,9 +15,6 @@ import time import uuid -import nest_asyncio - -nest_asyncio.apply() from IPython.display import HTML, display from rich.console import Console diff --git a/pyproject.toml b/pyproject.toml index f39bc88f..9e64fc40 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ authors = [{name = "Dan Wolfson", email = "dan.wolfson@pdr-associates.com"},] readme = "README.md" description = "A python client for Egeria" keywords = ["egeria", "metadata", "governance"] -requires-python = ">=3.12, <3.14" +requires-python = ">=3.12, <3.15" classifiers = [ "Programming Language :: Python", "Programming Language :: Python :: 3", @@ -46,7 +46,6 @@ dependencies = [ "pyperclip", "textual-serve>=1.1.3", "textual-web", - "nest-asyncio>=1.6.0", "fastapi>=0.141.1", ] diff --git a/tests/micro-tests/test_async_runner.py b/tests/micro-tests/test_async_runner.py new file mode 100644 index 00000000..b97355be --- /dev/null +++ b/tests/micro-tests/test_async_runner.py @@ -0,0 +1,148 @@ +""" +ISSUE-168: run_sync replaces get_event_loop().run_until_complete + nest_asyncio, so sync wrappers +work with no running loop, inside a running loop (Jupyter, Textual), and nested, on Python 3.12-3.14. +""" +import asyncio +import threading + +import pytest + +from pyegeria.core.async_runner import run_sync + + +async def _whoami(): + await asyncio.sleep(0) + assert asyncio.current_task() is not None + return threading.current_thread().name, id(asyncio.get_running_loop()) + + +def test_no_running_loop_reuses_one_loop_per_thread(): + name1, loop1 = run_sync(_whoami()) + name2, loop2 = run_sync(_whoami()) + assert name1 == name2 == threading.current_thread().name + assert loop1 == loop2 # the per-thread httpx session stays on one loop + + +def test_each_thread_gets_its_own_loop(): + loops = [] + workers = [threading.Thread(target=lambda: loops.append(run_sync(_whoami())[1])) for _ in range(2)] + for w in workers: + w.start() + for w in workers: + w.join() + assert len(set(loops)) == 2 + + +async def test_inside_running_loop_uses_background_loop(): + # What a notebook cell or a Textual app does: call a sync wrapper while a loop is running. + name, loop = run_sync(_whoami()) + assert name == "pyegeria-sync-runner" + assert loop != id(asyncio.get_running_loop()) + assert run_sync(_whoami())[1] == loop # the same background loop every time + + +async def test_nested_sync_call_from_the_background_loop_does_not_deadlock(): + async def outer(): + return run_sync(_whoami()) # a sync wrapper called from a coroutine running on the background loop + + name, _ = run_sync(outer()) + assert name == "pyegeria-sync-runner-nested" + + +def test_exceptions_propagate(): + async def boom(): + raise ValueError("boom") + + with pytest.raises(ValueError, match="boom"): + run_sync(boom()) + + +async def test_exceptions_propagate_from_background_loop(): + async def boom(): + raise KeyError("x") + + with pytest.raises(KeyError): + run_sync(boom()) + + +# --- context variables (lineage_visible) reach the coroutine on every path -------------------- + +async def _lineage_flag(): + from pyegeria.core._base_platform_client import _for_lineage_default + await asyncio.sleep(0) + return _for_lineage_default.get() + + +def test_lineage_visible_reaches_the_no_loop_path(): + from pyegeria import lineage_visible + with lineage_visible(): + assert run_sync(_lineage_flag()) is True + + +async def test_lineage_visible_reaches_the_background_and_nested_paths(): + from pyegeria import lineage_visible + + async def outer(): + return run_sync(_lineage_flag()) # nested: a sync call from a coroutine on the background loop + + with lineage_visible(): + assert run_sync(_lineage_flag()) is True + assert run_sync(outer()) is True + assert run_sync(_lineage_flag()) is False + +# --- the per-thread httpx session follows the event loop ------------------------------------- + +def _client(monkeypatch): + from pyegeria.core._base_server_client import BaseServerClient + monkeypatch.setattr(BaseServerClient, "check_connection", lambda self: "test") + return BaseServerClient("view-server", "https://localhost:1", user_id="u", user_pwd="p") + + +def test_session_is_renewed_when_the_thread_switches_loops(monkeypatch): + client = _client(monkeypatch) + + async def current(): + return client.session + + first = run_sync(current()) + assert run_sync(current()) is first # same thread, same runner loop: reused + assert asyncio.run(current()) is not first # asyncio.run is a different loop: new session + + +def test_explicitly_set_session_is_kept(monkeypatch): + client = _client(monkeypatch) + sentinel = object() + client.session = sentinel + + async def current(): + return client.session + + assert run_sync(current()) is sentinel + assert asyncio.run(current()) is sentinel + + +# --- no sync wrapper bypasses run_sync --------------------------------------------------------- + +def test_library_code_does_not_start_its_own_event_loop(): + # asyncio.run() and get_event_loop() fail inside a running loop (Jupyter, Textual) unless + # nest_asyncio is applied, which pyegeria no longer does. CLI entry points under + # `if __name__ == "__main__":` may still use asyncio.run(). + import ast + from pathlib import Path + + root = Path(__file__).resolve().parents[2] + banned = {"run", "get_event_loop", "new_event_loop"} + found = [] + for package in ("pyegeria", "md_processing"): + for path in (root / package).rglob("*.py"): + if path.name == "async_runner.py": + continue + tree = ast.parse(path.read_text(encoding="utf-8")) + main_blocks = [n for n in ast.walk(tree) if isinstance(n, ast.If) and "__main__" in ast.unparse(n.test)] + skip = {id(n) for block in main_blocks for n in ast.walk(block)} + for node in ast.walk(tree): + if (isinstance(node, ast.Call) and id(node) not in skip and isinstance(node.func, ast.Attribute) + and node.func.attr in banned and isinstance(node.func.value, ast.Name) + and node.func.value.id == "asyncio"): + found.append(f"{path.relative_to(root)}:{node.lineno} asyncio.{node.func.attr}") + assert not found, "use pyegeria.core.async_runner.run_sync instead:\n" + "\n".join(found) diff --git a/uv.lock b/uv.lock index 7a308e27..88f20120 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,13 @@ version = 1 revision = 3 -requires-python = ">=3.12, <3.14" +requires-python = ">=3.12, <3.15" resolution-markers = [ - "sys_platform == 'win32'", - "sys_platform == 'emscripten'", - "sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] [manifest] @@ -79,6 +82,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/ba/fbdc41608d4e2fb6084d960a41b392fa82beb5b126c2466de549b5c67fc8/aiohttp-3.14.4-cp313-cp313-win32.whl", hash = "sha256:7968634fa3a967a2bc0b9aeba1d5a1955501dcd7d0de44b96f7ebfb662797735", size = 479943, upload-time = "2026-10-05T17:40:07.402Z" }, { url = "https://files.pythonhosted.org/packages/35/51/d75629750e705832fd5cd52516a82943ed58b6e09c30e14830f5d87452fa/aiohttp-3.14.4-cp313-cp313-win_amd64.whl", hash = "sha256:c0a894b0265d139cd4c2c8bd4643822cc289a4a5331e21e810881bd000ffb2dc", size = 506209, upload-time = "2026-10-05T17:40:09.49Z" }, { url = "https://files.pythonhosted.org/packages/02/64/66452d2ffcc13e5e5ee4ba4a968656fa4a98c29ed5ff0205d4fde02b2943/aiohttp-3.14.4-cp313-cp313-win_arm64.whl", hash = "sha256:da16c3037178e72589d91de59536d271dffc92c2be2b47c38a45538cba54fd29", size = 487163, upload-time = "2026-10-05T17:40:11.526Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fd/b653b1f969e2e949fe4726af7a8043e8ef117f202bed7757ac8564e077a1/aiohttp-3.14.4-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:749bfc43bb1df71bbe6ed215044d5412d786698fc5771d2037436ca49622f3c9", size = 540738, upload-time = "2026-10-05T17:40:14.109Z" }, + { url = "https://files.pythonhosted.org/packages/90/b5/eea49a0bb697deffac5165d707ec53a24748d6720b3af77a544107b49573/aiohttp-3.14.4-cp314-cp314-android_24_x86_64.whl", hash = "sha256:c113e4b489d711f606ca278cd8dc89179746244ea841aa0638b1b134600afad0", size = 554494, upload-time = "2026-10-05T17:40:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/11/ea/cf8f4efbbfa8572d9965cd43b3c6c84c581aa006772e5ce3ab4020027e9b/aiohttp-3.14.4-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:50969522bc7022026a2c7968e67da5c789f6b716b988edac55dc630390efd5df", size = 522653, upload-time = "2026-10-05T17:40:18.879Z" }, + { url = "https://files.pythonhosted.org/packages/a3/24/9f6721f0b52323789cb1041ffc3afa729462d9925607e733a065b6fc5e17/aiohttp-3.14.4-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:cbf92cd7a1c800cee244558dd5630abb45c1c1093ef7b0d546a99f526ff7a9eb", size = 529697, upload-time = "2026-10-05T17:40:21.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a4/399debc3c2ca0ab88a08e3082b4c4f62d0f66978af60243c63f2345ef337/aiohttp-3.14.4-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:fc76be08ff407fba717a769aff04ca1b4bf9ecfdcb5caadef84a563fdbbd146d", size = 540526, upload-time = "2026-10-05T17:40:23.548Z" }, + { url = "https://files.pythonhosted.org/packages/a2/97/90379813b18b795bccdeb3a5a85e9b93ac2c69f9c2a5d0faba59da3ad6d1/aiohttp-3.14.4-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9b416f995b68a921069e6ec61fa07f2ac3ff033d92e97a69f673af89f5bb954d", size = 818866, upload-time = "2026-10-05T17:40:25.842Z" }, + { url = "https://files.pythonhosted.org/packages/78/70/824fd0dac819652f1df895b3f621a75bf0a3050c30e38d8d2316e34ab821/aiohttp-3.14.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2c9585101cfca10e74a07cc0ef2bdc6d90616e6750926b20456f429d0608f740", size = 549666, upload-time = "2026-10-05T17:40:28.523Z" }, + { url = "https://files.pythonhosted.org/packages/8c/45/eafb2dd200dd2b770ed25a2dc5731c4ba5d58ab3fa8e2e82494bb946808e/aiohttp-3.14.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3c4dcf611b095e7983421f49d01ffbed7ed574891533d606ea115fc23e7c4e90", size = 548961, upload-time = "2026-10-05T17:40:30.613Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/6c733a1c71300293471ac7ef1dffd12b5b4dc9a43c53461224b2b8a7f667/aiohttp-3.14.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8f61a9b5fa56c58e3441f9dc64137f786232d40fb89127190d0e0f84e1e5865", size = 1883165, upload-time = "2026-10-05T17:40:33.062Z" }, + { url = "https://files.pythonhosted.org/packages/37/34/885ddbd351679a31141b25e0d1a5e4f67738806e564c858b399709b61239/aiohttp-3.14.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d43e538dfc85b705fd832620d050970ef5613b3869a7169b44a554b9dab9eee9", size = 1844119, upload-time = "2026-10-05T17:40:35.266Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ef/0a64dac53c11d569851efb3e7eddb43551df72b2c172ebb34cccc93bcd3f/aiohttp-3.14.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4135c4bb4b7682a7633fadc7170ea969d843f83aa7224e70111a20675105c985", size = 1930222, upload-time = "2026-10-05T17:40:37.527Z" }, + { url = "https://files.pythonhosted.org/packages/69/5f/774792ed8f973e0d234fcb06b0f0bc9f29e9a0a0dd847f6418c2904be7d9/aiohttp-3.14.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9055324f156a94fdf6dc9a825ae60f9a2947b88f591ea81ee80826633de62ae7", size = 2038842, upload-time = "2026-10-05T17:40:39.815Z" }, + { url = "https://files.pythonhosted.org/packages/cb/05/e00f35581c97656d9e864edaa03292382c620dd1d9c836a4f73a2279acc4/aiohttp-3.14.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb22c8e4b60385a9b414c70c6e8b2d0f4b23ff7fc4bb572ceb58297b228169f1", size = 1887845, upload-time = "2026-10-05T17:40:42.359Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2e/07e3eff5b4c1b082a2eaf0ffb508b409b21ea1ddc9fdc57f3eabb51469a1/aiohttp-3.14.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3b6945559a260112742ed58cde2165488d2fc51aeea34afbaa99d9371b43e1b5", size = 1702533, upload-time = "2026-10-05T17:40:44.569Z" }, + { url = "https://files.pythonhosted.org/packages/75/44/816844b7f876e6f8fee4ecb088269fcd92241da712e4814a4d624eda13a9/aiohttp-3.14.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f4078a90b174f15efb2c8725e8720c40dbd3b2cf6350dbc085c964a938d9de7", size = 1849058, upload-time = "2026-10-05T17:40:47.818Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/163242e12464a1f3e58a77e28beca949652ddce84abdd5500a91c70a1e0d/aiohttp-3.14.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f433c5654e32f72de3ef074d715eb5c7604eb6d28a5c2f3c9e5056f20fe6b306", size = 1854600, upload-time = "2026-10-05T17:40:50.401Z" }, + { url = "https://files.pythonhosted.org/packages/f2/59/5c1ae708a89524eddfd9c727b87cae26b5c50c3c76683b910ac06151ead0/aiohttp-3.14.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:871035fe79c636b6bc126ed78df37d72b830dfc751612cb4b1040360edf2719f", size = 1896565, upload-time = "2026-10-05T17:40:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/37/45/95300a7de69241fe47d3f838f3fb582c712782e172d447ff650a013ea673/aiohttp-3.14.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2617132524f66338f6c1d218cd16081576aefc40df4f2bcba338a99fbf67fec1", size = 1693092, upload-time = "2026-10-05T17:40:54.862Z" }, + { url = "https://files.pythonhosted.org/packages/ff/33/01a8e61d48d0094121092c74125df14c0f8f10ee3149bfe68b6f869409a9/aiohttp-3.14.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d8bc326133272deee8ef337581550450e4bb735c0520be893b950a1f5baaf41a", size = 1917073, upload-time = "2026-10-05T17:40:57.656Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d6/1a4f24624cda6686d5b927e26d5d1ae3ebb692faf88e93017fab4b391fd0/aiohttp-3.14.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ec57223e261b7fa9979c12dbce009ca53439be76cac3af27f860d3e4b1d6f7a", size = 1872656, upload-time = "2026-10-05T17:41:00.123Z" }, + { url = "https://files.pythonhosted.org/packages/be/be/ed286fcfa2d22061ae021b568c790123505cd482df35e23023339ecaed96/aiohttp-3.14.4-cp314-cp314-win32.whl", hash = "sha256:7242043e71fc449a19a47d92f4e9fd1e0ae8d3f88488982381f422bf6d651218", size = 485461, upload-time = "2026-10-05T17:41:02.686Z" }, + { url = "https://files.pythonhosted.org/packages/c0/74/e040e6f65f4da305777f1adb3023d47401693489e4a337c983b52d2a0a6b/aiohttp-3.14.4-cp314-cp314-win_amd64.whl", hash = "sha256:019587c7b3a44917dd61bcb312fd5c034f341dc9851b83e7b41b65e08b68ca0f", size = 512147, upload-time = "2026-10-05T17:41:04.98Z" }, + { url = "https://files.pythonhosted.org/packages/2e/5e/bddb33ae15fdd5a68a10a986587aa9916c418a712fdd110d3b3ae9b51407/aiohttp-3.14.4-cp314-cp314-win_arm64.whl", hash = "sha256:60dc71d38db0988f37e78f6ad4a010a2f6355cfac3fff5f130cf5ef2231f3f0d", size = 494685, upload-time = "2026-10-05T17:41:07.366Z" }, + { url = "https://files.pythonhosted.org/packages/22/2e/7b884014b40573f919fc3a528e5028bc37b249e31a93928ba61bdd25c960/aiohttp-3.14.4-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:674f53ab9d2794e2dd767619a3384bf1006f8d075e43c19d449a645f8ff641c2", size = 855696, upload-time = "2026-10-05T17:41:09.514Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e6/b6e2b4f580ab6ae39241bb9182aca60e6e1915cdad0148faaa04db3f366b/aiohttp-3.14.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6d243221f73e5ac546c2ed9255100423e4bc092b08b944f23498e8cf3096c26c", size = 567931, upload-time = "2026-10-05T17:41:11.685Z" }, + { url = "https://files.pythonhosted.org/packages/63/99/ae8e3a1a18adcbf636839d18b3cccc51007836ccdae5209381c5cf82d1ae/aiohttp-3.14.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0daa016eb74e7888ed5f9ceec6eea3158999c1c4a115ef5cbe88baa8d924f94c", size = 567421, upload-time = "2026-10-05T17:41:13.836Z" }, + { url = "https://files.pythonhosted.org/packages/63/38/c5d4bb58be72b967a4090d2deeb38571f8c992852936c51dbbbeae49db1c/aiohttp-3.14.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70c031a622aa20add05ebd234b90adaf6bf51c1c88cc305ec760721af83308c3", size = 2054173, upload-time = "2026-10-05T17:41:16.098Z" }, + { url = "https://files.pythonhosted.org/packages/eb/87/3c8a9c7670f56d478a75c5bb84b336fb61a67b908e36c30a4a96ed8c8e86/aiohttp-3.14.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7df363fa7c38945a896e12c69af4a1a56cbd4152791d9e41fd0bac396b72de38", size = 1918296, upload-time = "2026-10-05T17:41:18.478Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/bd00e499c0a1505b44f5e23b9739034ea9be792ad42537f2894211ba1c07/aiohttp-3.14.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02a508ba5ad91c4d730523584c0adc65882274bba5e37c33bc2f475e37577256", size = 2027513, upload-time = "2026-10-05T17:41:20.874Z" }, + { url = "https://files.pythonhosted.org/packages/23/1d/a3666a7c224f86a881f18d673a8ffdc92fa4c35274fb4361822f8f0dc566/aiohttp-3.14.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0cb3edece6fe6a944eaf97d803b88f606da6bc1600b1894c2969e78ffdc1fc29", size = 2152686, upload-time = "2026-10-05T17:41:23.181Z" }, + { url = "https://files.pythonhosted.org/packages/46/7e/f4204b8c4959c46f6367c182afbbacef08a1b53874281912c52fbd80151c/aiohttp-3.14.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21ce1223b461bcc5fb389a7204001578f1c0b85c2da60a84d915ebb021294245", size = 2006431, upload-time = "2026-10-05T17:41:25.776Z" }, + { url = "https://files.pythonhosted.org/packages/33/43/091e69d42967cbea833ceb355c5457f8f70748fe08b88c9d91491b3fafb8/aiohttp-3.14.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35d5432f0dc1c8b71307e9112461b52f336da225e344283eec4779222c0a1dff", size = 1789101, upload-time = "2026-10-05T17:41:28.095Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/b57cbe533c01098c5d30471f057e7c3c19f281122f756acc9c716b636e2c/aiohttp-3.14.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6ec364493057c118d08292f7cd60865965c209167d8657b45643a26aef77495", size = 1974472, upload-time = "2026-10-05T17:41:30.499Z" }, + { url = "https://files.pythonhosted.org/packages/9f/44/79acce03611450e4ed8594f96f1cea40d70bc84fb4e918f94d7d9454a4af/aiohttp-3.14.4-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:70492983b7aed9e61bda82fe1ce80bcba9199610886443133783a288638923c0", size = 1956340, upload-time = "2026-10-05T17:41:33.009Z" }, + { url = "https://files.pythonhosted.org/packages/da/bb/36e6cbd6720e3377a02f8709aec6fe80de729ef41e78ba01f13d50363c73/aiohttp-3.14.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a77776673331577147e9d25cd7833a72e8891b47556336cff06ba1569e488b99", size = 1965771, upload-time = "2026-10-05T17:41:35.506Z" }, + { url = "https://files.pythonhosted.org/packages/69/0f/879735ac70ce5e6852916eed51c706a517b205150a8d384f9fa60933a3fc/aiohttp-3.14.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:73799000dd6fd5247094fd8e6d3e1eb871e41aab5cc35dff9d9f654cd230bc24", size = 1780297, upload-time = "2026-10-05T17:41:38.284Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/7c030ca5b6baf3b02eccd11afc3d58f0b35e407031d5cc78cae9c24921c0/aiohttp-3.14.4-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:27b370fb532e707e8c96d04fa0c96301fb7dba2d50aaca57f6c456cdfffec5bd", size = 2001374, upload-time = "2026-10-05T17:41:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/ddacbb8141d727034c51dd192d17749521d5b30b03f84aa034325396089e/aiohttp-3.14.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:884e0d1c707b6217fee3080b9b4029eee7551af788ee761010df19be158414b7", size = 1968531, upload-time = "2026-10-05T17:41:43.62Z" }, + { url = "https://files.pythonhosted.org/packages/3a/08/2214f823701eebc3e57db141faeae76df7bfd415f254cc7c1692258f228d/aiohttp-3.14.4-cp314-cp314t-win32.whl", hash = "sha256:f2e3d34edb151d3e27f93a8338e2da33e2c7261cd4c879ce5f5fe280cc190ea5", size = 504126, upload-time = "2026-10-05T17:41:46.321Z" }, + { url = "https://files.pythonhosted.org/packages/91/a1/90e9b6fd23310b4e82d0c0a37b5ecc2944053350473c57533c1da9647235/aiohttp-3.14.4-cp314-cp314t-win_amd64.whl", hash = "sha256:88cf889e51092537fe44adfbff96c2a22d6479d6f92b97b3d413fbfd0a4decf4", size = 531494, upload-time = "2026-10-05T17:41:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/5b501472c92b9b1dc53742591d6210dccb262962f4721299300d3a9f664b/aiohttp-3.14.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ca450c6d42fda7c0bfaf0e200f32f77c5f2c960a33be1e14d197c84588b7f5f6", size = 510544, upload-time = "2026-10-05T17:41:51.358Z" }, { url = "https://files.pythonhosted.org/packages/2b/27/5e1f8446545be98e9416af59c396b1ed1f9f3294afb0a40ee3a709889273/aiohttp-3.14.4-py3-none-any.whl", hash = "sha256:5c6758ba62aea282c537179cfc8474a90f2b5f7b089cc5ff66d8920d86a9bfdd", size = 279487, upload-time = "2026-10-05T17:43:44.905Z" }, ] @@ -185,6 +229,16 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, @@ -320,6 +374,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, + { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, + { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, ] [[package]] @@ -365,6 +443,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, @@ -433,6 +548,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/dc/bd72b26be8953f80625f63151efd38eee71c76ca6cf591c08ff34615a79e/cryptography-50.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1489e263a8048bb8b6a8bac662eb2d402ea5d2b7b4699b72f385f1e2772db105", size = 4852708, upload-time = "2026-07-31T14:23:52.715Z" }, { url = "https://files.pythonhosted.org/packages/27/20/c930314a2ab476d15dec966ec87e2e9637bb02b06106b12c0396c57bb603/cryptography-50.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7cec5b856506da6defb290f30c9ee687d5f5e8cb0bd3f6459dde43b0b4fa40ef", size = 5004179, upload-time = "2026-07-31T14:23:54.887Z" }, { url = "https://files.pythonhosted.org/packages/32/2e/c9db68a0c4bfa28e310707527c0ee3a2bd254104d2e02e68f368e197aa4c/cryptography-50.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:bd1c592e4d5974f0d08d4888e432157adba757c66da0246918e43677fafa2d30", size = 3840395, upload-time = "2026-07-31T14:23:56.677Z" }, + { url = "https://files.pythonhosted.org/packages/c3/fb/951032a3bf22a5697c83183fb6294a4843772947a70e616c57b3ff5f522e/cryptography-50.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e7d93abdbd2990caced757e5fade25302f719c3c8fb6e6fff2dde98999fc41", size = 3989258, upload-time = "2026-07-31T14:23:58.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/67/91eb047e69c5e845f2f14b8a2e4a1aab0f283cb885531e9e22c8adb176bc/cryptography-50.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:19736989797678c6af1e55cd49055cdbcb55d8f6b5583ac5335f933aba9101dc", size = 4700648, upload-time = "2026-07-31T14:24:00.702Z" }, + { url = "https://files.pythonhosted.org/packages/30/82/85f0f7425c856b9f96459411eb12e74ef72df9caf6f8f15bf23a33ff131f/cryptography-50.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80b63928fa35083b33966ce1efb70e5b9607181e49dcd1c22c8c005e319f667f", size = 4682442, upload-time = "2026-07-31T14:24:02.538Z" }, + { url = "https://files.pythonhosted.org/packages/1a/28/b555a365adff1cca2fbe7b9e487d68a40de6bc67ff2cb587473eb43de0e7/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d58c3db7cd6eed54e6c06744db55456b65ebd7492ddeae9c1e93cfca7aa857d3", size = 4707596, upload-time = "2026-07-31T14:24:04.394Z" }, + { url = "https://files.pythonhosted.org/packages/72/d8/f52538140cc719df62a01cf87d1c7142318d235817109d6f4054d7c352d6/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:df2a58a472f332225671c35b0a830208b86d004f82baa8530fa3782c85646533", size = 5314552, upload-time = "2026-07-31T14:24:06.31Z" }, + { url = "https://files.pythonhosted.org/packages/38/14/6120e5bd7c5aa022ad15424ba4d5c5269d0d9448ed4d55e492ea91e3c1c4/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11b74db56cdbe3cdee6e3f6982ecb70334fa10dce99ed58bf7894aaaa3b2a037", size = 4717113, upload-time = "2026-07-31T14:24:08.349Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/190bf38c3ee2e0f8efc9860ae100c9df4169742eef274b91e7aa1cb133b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f59e38625469987d7ef6d495323c55e7db6c212eaf6112267e0d3b565a2e9c9f", size = 4338580, upload-time = "2026-07-31T14:24:10.227Z" }, + { url = "https://files.pythonhosted.org/packages/3a/63/504ccfbbe61fd8aa983f7f146399cdf034c72c2fc55f5b2dfdcdcdb20c99/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ecfed7367f965a0328cfbdd70da860f15441f002f613185668c6e6ebf5a0ac11", size = 4707038, upload-time = "2026-07-31T14:24:12.169Z" }, + { url = "https://files.pythonhosted.org/packages/01/77/2cf79bbfc4d12ca106437a6e170d6aaa01a373e93093118aaaef0e801bd4/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9aa87839c383bdbab6ef865787a1fb877af8dd03464c4400322726feaaadfc6d", size = 5273110, upload-time = "2026-07-31T14:24:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/e5/45/8aae2972c520145377ea3559a605a899bebe227bf070b33cdb445929a9b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:6ba6a53445bd3cfa809ef3ef5f1589aa6ba08784a1d962bf47d0940e871dab1c", size = 4716439, upload-time = "2026-07-31T14:24:16.415Z" }, + { url = "https://files.pythonhosted.org/packages/7b/20/4fe50b619a48c2525cc46e2dbc1ac490708d704be5d467bdaac6dc955682/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3f5735ffe4996d28b809371756219f5354864902a3b9e7c0b9ee87041209fc9c", size = 4837383, upload-time = "2026-07-31T14:24:18.553Z" }, + { url = "https://files.pythonhosted.org/packages/92/91/3a31366e183343d3703f8995c095f5734676bd6938118047e50fcf279eb4/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1b4a266766514614f8aa60416e71f2fc6e575d36e7bdc90f644fadb2f4b75b95", size = 4985772, upload-time = "2026-07-31T14:24:20.385Z" }, + { url = "https://files.pythonhosted.org/packages/74/9a/02ffe35b2853d121689871eb5dce862092562b3a1ed5cc98f1aaed441506/cryptography-50.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:12b9c6996425c76ea6c457ace4f3073e715b8c545add07cd1a8f3a4f90691269", size = 3816291, upload-time = "2026-07-31T14:24:22.125Z" }, { url = "https://files.pythonhosted.org/packages/03/37/73d005be173aff344af30e9fd2a576575cb2391a7101d9cd3842e1fa8cce/cryptography-50.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ccdc4a71a4dabae05de219404f9f4abc38e3b58422177ff93d0da05967dafa07", size = 4036009, upload-time = "2026-07-31T14:24:24.122Z" }, { url = "https://files.pythonhosted.org/packages/ff/c6/7a6202a534e32103a285b7834a120869557fe198d51d7cfe59754c8bda9c/cryptography-50.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:910e1d2668e7de9648f2bcee30e180db2a6b15c30f887d7c4c93ddf96e3992e3", size = 4745252, upload-time = "2026-07-31T14:24:26.118Z" }, { url = "https://files.pythonhosted.org/packages/85/4f/0fa8c2f4428198f15d9ff8d63400e27afbf94ce833f6108da1eb3753f945/cryptography-50.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a91296cb61e8df6f86d0c19cc4068228da256bf59bf86049fbd821084565327f", size = 4728939, upload-time = "2026-07-31T14:24:27.994Z" }, @@ -462,6 +590,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, { url = "https://files.pythonhosted.org/packages/c1/62/2c616337cf6ba7b07ebbc97f02c6c945a8e2f76b365e33ee809c32ee36d1/debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1", size = 5336288, upload-time = "2026-06-01T19:31:00.79Z" }, { url = "https://files.pythonhosted.org/packages/f8/99/9175103392f84c4b1bf7622888cdc68da07f0ff7d9e581266428f6776033/debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0", size = 5376567, upload-time = "2026-06-01T19:31:02.56Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3d/f4bbb323a548bfab2af3d6b4ffd9bf22636e55956a1285d317a1de643aad/debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782", size = 2477209, upload-time = "2026-06-01T19:31:04.157Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2d/6e7ec524984a1702777868de49a4c53202bddac2a432a76a093469587750/debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e", size = 3927115, upload-time = "2026-06-01T19:31:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/97/47/d1aa6d64005a98a9144647d99306b419396f9ad7bf1d73c119e17a81fb4d/debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c", size = 5336724, upload-time = "2026-06-01T19:31:07.711Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/b905b90d163af11878c1af8abafa4a25206335e112e284e413454543a6da/debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8", size = 5373803, upload-time = "2026-06-01T19:31:09.469Z" }, { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, ] @@ -571,6 +703,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] @@ -1186,6 +1350,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] @@ -1306,6 +1492,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9d/22/ce780be666f89b77cdb855daa9ec62e87bb7f69e9f403e4a5d83a2b2208f/msgpack-1.2.3-cp313-cp313-win32.whl", hash = "sha256:d2f9c4f85e47a44d26d5baf3b041eef23436e224d44eed273f01bd8a12048d9f", size = 68258, upload-time = "2026-09-29T02:32:33.163Z" }, { url = "https://files.pythonhosted.org/packages/51/06/c3def9bc4db283103c5901b302ee2a4305cb1e69729244f94d9bd8f8e8e7/msgpack-1.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:bb89b5dc30469c84bbf8684826eb851d82412ca95690e111b9ac5e8fb343961a", size = 76569, upload-time = "2026-09-29T02:32:34.412Z" }, { url = "https://files.pythonhosted.org/packages/12/9f/cef344073858b80adb92d6ea342e20b0eae7a8f6fe70281b69cf03707270/msgpack-1.2.3-cp313-cp313-win_arm64.whl", hash = "sha256:471e12a6a42498a31490c206e0069e343b6a7c35db540be73a879eb06f5be047", size = 71530, upload-time = "2026-09-29T02:32:35.892Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8e/f777f74e38731c428857933c8011596f2d2f3160c821152f23b6ffba862f/msgpack-1.2.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3a31905206722103a84c1f72633fe30692cff6732c9d262e09a27dbc468797c8", size = 92042, upload-time = "2026-09-29T02:32:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/a0/71/551608543ee5d590f7e8d522267665d6d9946866ad2a2a70a770f7c70793/msgpack-1.2.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3372475211a9ce1a23acefe512cb3e121d18c95dc74ed56cb1819ef40836ebf4", size = 90578, upload-time = "2026-09-29T02:32:38.883Z" }, + { url = "https://files.pythonhosted.org/packages/ea/11/6d78ce5a9a58bf9ba7b1b6a8f649173b030e6770c8019cf330b91825ee5d/msgpack-1.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9324c54995641c3d1f92a9d55093c8cde0ffa2fbc87a467a688ef60428393220", size = 454352, upload-time = "2026-09-29T02:32:40.34Z" }, + { url = "https://files.pythonhosted.org/packages/3d/08/feb9a196269ba7809f44f9117d9e4a601c41c313f6144fd0c337293a5488/msgpack-1.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8ef3a66e4b52d2d7fdd90df2984670124b2ff7546d76bb25dcf68ef47f7df58", size = 462562, upload-time = "2026-09-29T02:32:42.176Z" }, + { url = "https://files.pythonhosted.org/packages/f5/77/3a674f366def24140b103d1ffd4fd27b3d912a13e47da67422afa16bebb3/msgpack-1.2.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:902f3490db0e07a7d40b48536a85c9b28fbf1397e7e1658a45a55f958e303620", size = 418134, upload-time = "2026-09-29T02:32:43.693Z" }, + { url = "https://files.pythonhosted.org/packages/48/82/944e71f280577490d99a3951cbce21aa4cbe04e7ab42cb373fd668af883c/msgpack-1.2.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e51eca14fbb65c4e0a5a9657346962bd3dca78c08e04e3d4dee70ef48687d30", size = 445937, upload-time = "2026-09-29T02:32:45.739Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ec/feddd629c4a3edf1395313680450c525086cceab56dec0d4de9da9ccb618/msgpack-1.2.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f42f146752eedb6765f07dcc04d72dab0a25779ec8d4a88c0085263ce114f22c", size = 416450, upload-time = "2026-09-29T02:32:47.558Z" }, + { url = "https://files.pythonhosted.org/packages/e4/59/263a10f8c4613ba0713f48cbda7695ac8dd6d6fab2fcbc9168f03f23a94d/msgpack-1.2.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0ed5823c4efc20fe87d3530665f40ec18a002be003114814c21235cc8d256207", size = 459546, upload-time = "2026-09-29T02:32:49.145Z" }, + { url = "https://files.pythonhosted.org/packages/1e/21/addcfa1e583cfc8a22fbdc57526621b5decd7ad676ae12e9150b7be1be5d/msgpack-1.2.3-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:2487453ca1b6104442c6442f9a1a8fee1fe8f428a70d99d4cba799108b304150", size = 53462, upload-time = "2026-09-29T02:32:50.708Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2c/3cb5c8524a1335ee27ca952c7ab78d375a16fea8e18ae3767ba0c880416c/msgpack-1.2.3-cp314-cp314-win32.whl", hash = "sha256:6df430419f2338cb71e4a34d6e64f83c88ccd321f91f40ba4513400b36d864ec", size = 70294, upload-time = "2026-09-29T02:32:52.037Z" }, + { url = "https://files.pythonhosted.org/packages/23/f9/9172ff3cdb85d160ad06df5e2708a5fce7682982a5eee8d31869b9f69d2e/msgpack-1.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:84a6616d396ec1bc18a1e83e67c96a393ec35dfe5e17434a5be7b9aa0fe988ab", size = 77778, upload-time = "2026-09-29T02:32:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/04/e8/b4c23178bcf605ae17cec48a75530dd69d49b0a5a6f5f4df5c47d59f746e/msgpack-1.2.3-cp314-cp314-win_arm64.whl", hash = "sha256:7a003b02c6ee2eea6dfe0bb08818631e3597e69f0131f2a8250488a1cc553290", size = 73794, upload-time = "2026-09-29T02:32:54.763Z" }, + { url = "https://files.pythonhosted.org/packages/66/b1/92704be352c4f428b7e0a0e0fb210cb1aa2b1c42c102b8dc22d34b82fac0/msgpack-1.2.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ccea05b5542f6d283fef3f0a8e93a7f0be90af0ddeeef84c25c0216ba76dcae1", size = 93721, upload-time = "2026-09-29T02:32:56.342Z" }, + { url = "https://files.pythonhosted.org/packages/49/78/9c91f1e86cadcbc100b3780fd429c3715648704032a612e77a00646ebe79/msgpack-1.2.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b1631e12fe572e181cd77e831f69335d6cd5278eac22e3db3f33cf264ac2ac18", size = 94256, upload-time = "2026-09-29T02:32:58.056Z" }, + { url = "https://files.pythonhosted.org/packages/91/4d/270f9725921ae88a29d37a774a77ac24f0ef1411fc960a63f5a4665e81b4/msgpack-1.2.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e54394b7dbe2e12ab032d9d21feef7bb61a90a150a2623633ba3781ba69dcb1f", size = 471673, upload-time = "2026-09-29T02:32:59.886Z" }, + { url = "https://files.pythonhosted.org/packages/48/b8/eaa8d930f72dc1d1dd79511dc2ccf965922b059f2f0ed3b30aebac8c4b11/msgpack-1.2.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63bb7448a1e9111319ae2430c09a5596140c160422830d6271bc75730ff2ff9a", size = 466257, upload-time = "2026-09-29T02:33:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/97adc805037bc7e24c4e2f711bbcd3b28be8ec9aea3e778f18208cfbdb46/msgpack-1.2.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:382bc88fe90f29f5ac8a0b65c7046ff255356f2f2f3186c30e370215736fa1dc", size = 418484, upload-time = "2026-09-29T02:33:03.402Z" }, + { url = "https://files.pythonhosted.org/packages/0d/7e/1c53302606fe436ab48ba539ebafafe4a6a9efe12c4f04dc7eb36912d93e/msgpack-1.2.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c77e27790ad72989db783d5303825fba0b71550f00a490efba35cde7dc4b719f", size = 454064, upload-time = "2026-09-29T02:33:04.977Z" }, + { url = "https://files.pythonhosted.org/packages/00/2d/9ee0170f638907b396c15c6cd26b3e54f869159efc6206683acfd8f696e1/msgpack-1.2.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:700bc0fc9e968a292b9137ee70e7a012f7e115bf0107ce45e3a88202788dfc1e", size = 417901, upload-time = "2026-09-29T02:33:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d2/905c84490a75cd15a27065407cd085d201f7d392e1e0411f49f03fd31ade/msgpack-1.2.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5bd5f91ea75c45cafcc5433ba8fae59b708b736ec178d2441c40c499e9e079db", size = 459896, upload-time = "2026-09-29T02:33:08.361Z" }, + { url = "https://files.pythonhosted.org/packages/37/cd/4ce5809b9ab3b114d7cca64863e436820fa1614b49d55ccb93d49824ac2d/msgpack-1.2.3-cp314-cp314t-win32.whl", hash = "sha256:7995a7c6a62a1d6e7df211b4a16de513bd99fd053525050a319f80f44fb8015e", size = 75983, upload-time = "2026-09-29T02:33:10.023Z" }, + { url = "https://files.pythonhosted.org/packages/8a/31/853bb580744c24be0dbd8b090c3e6987dce466a1fc840fe50c0ac2ef9044/msgpack-1.2.3-cp314-cp314t-win_amd64.whl", hash = "sha256:bfe7d5b62cbe7aa664f0b3e2c49077f10fcdd06183d3014f8271ff3c5edbfbf9", size = 83757, upload-time = "2026-09-29T02:33:11.441Z" }, + { url = "https://files.pythonhosted.org/packages/0d/49/9f1b2ee484414eef9e21ee2b2b23b482bb71433ab9bac1da03cbda15ebf5/msgpack-1.2.3-cp314-cp314t-win_arm64.whl", hash = "sha256:1f585407f740a9eac04a3bb82c61d68a0ea78f90e29e670bfb086b9ce3a518dd", size = 78128, upload-time = "2026-09-29T02:33:13.063Z" }, ] [[package]] @@ -1357,6 +1566,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/27/32dde80245e2024e9bb7a6ca3c2fb7c695dc74014cba557cc35be6f91e24/multidict-6.9.1-cp313-cp313-win32.whl", hash = "sha256:9c4880d017555d70dea367dd49271830842d48e3891c2da97da7ce8c4abcee40", size = 52378, upload-time = "2026-09-21T17:56:16.959Z" }, { url = "https://files.pythonhosted.org/packages/be/78/1bac2987edac273a6b27fa50e9204bc3466c94a7b4f6a44828d730f8810f/multidict-6.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:ac51cd64bae51c462ea58ad2492c9b8209667a4ef60c45c4a304518b67598d5d", size = 59449, upload-time = "2026-09-21T17:56:18.336Z" }, { url = "https://files.pythonhosted.org/packages/e1/32/2a77ce19eea48cb9b3521a202b513ba3349aafa702c8317be0b645ffb74b/multidict-6.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:37a9ebe00c698279213d56e6c64e1962ab1e092918270649b397cac3dc196ca4", size = 54713, upload-time = "2026-09-21T17:56:19.774Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0f/c6041015aa2cdc11e1dff0cae58898ae5525d19e35efd65a4ecf3c6ea235/multidict-6.9.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:fc0dcb22fa9aeabfe3fa4e0430099acff985ec5d77a851382f76cc6146e780e5", size = 62336, upload-time = "2026-09-21T17:56:21.181Z" }, + { url = "https://files.pythonhosted.org/packages/23/db/95bd0afb130a0149c955f1f066143528d60864e64f41ff5a1e1313609361/multidict-6.9.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:024123f0ab402ab33828e24eb80fa8f25167d0d3783ba5f287e39ed741e6abf9", size = 54892, upload-time = "2026-09-21T17:56:22.63Z" }, + { url = "https://files.pythonhosted.org/packages/94/cc/8aa34ae8d09498e8da003f485c03371b55cf1bc6d56cff861b3a7de61251/multidict-6.9.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:af1b5a92315048c3e36bbebfa7d4760a9c3e910bc4166f11b20d77d20d6bcfca", size = 56251, upload-time = "2026-09-21T17:56:24.36Z" }, + { url = "https://files.pythonhosted.org/packages/52/48/22baa3b95375096369b04c4348af14139570f302f951773d2c68bf0ccf2e/multidict-6.9.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:b2483da477932ad1983d1d33c18bc3771c6fb00cfbaaed70a875fd547ef8e840", size = 96345, upload-time = "2026-09-21T17:56:25.777Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3e/b96779dcac28ec6d491fd821112a0156b519b6701bba186cdf6f6df737f4/multidict-6.9.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db4d697b18b6ef5528b1f36bfa25072cd2a421869f5963bc0e92c8a34b9e2800", size = 58901, upload-time = "2026-09-21T17:56:27.364Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b4/8e6d950f02ca6ecc00ecf671f2ddb5dab7017671a8d197326f75621f5786/multidict-6.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:854fd2f1bc6e8a56b89910b5cd7261a8b40f13ebb31572da985ce59c7da0886d", size = 56491, upload-time = "2026-09-21T17:56:28.901Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8f/212ed7e03282c7bc271e3796bf985b53d5727c2827361e3dd9c5ee6b093f/multidict-6.9.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:03731f6fc036180700c9dc2308205a48e5ca6f3ff03087739ab746f294022201", size = 332297, upload-time = "2026-09-21T17:56:30.495Z" }, + { url = "https://files.pythonhosted.org/packages/a0/97/555aab000e03ecba85c0a1837fd5674d8bf10949490df7800da3a40660ce/multidict-6.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989261c5f1735a165f2e4e87cf6d5f17ab734fa18f9ad0383d5adfcdaefce701", size = 329197, upload-time = "2026-09-21T17:56:32.652Z" }, + { url = "https://files.pythonhosted.org/packages/3d/25/f3539b5bdc147beba66015795dfe589eedcc580348fb1a8c69b1df4196b5/multidict-6.9.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b4c9e5d05b126b267ac048a89a0e2d9b48b1b648add62d4872906304a8590610", size = 308456, upload-time = "2026-09-21T17:56:34.657Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7d/4665cad8fc326787d218879be879d86dfe32f006c1f88ae47b04d3b52fd5/multidict-6.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9d0a21cf76153de8f2d96a877991d6bc59b9ab5180b949e50db73cc193b4a694", size = 343382, upload-time = "2026-09-21T17:56:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/41/01/e1e9abe27f492b22dede492bc423015597412b14ce074f7475f4ecd80185/multidict-6.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e7386aa18d98d6b8af44b92173654ec469237fda35f8e8523e43b581a86f476a", size = 346848, upload-time = "2026-09-21T17:56:38.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/8d54118bc228e64e1087f1729647b93bbea225eda4a3f914663a6f410bca/multidict-6.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b69651732c64afb691e50cdc3387cae305e0eeff8804fe3e3ce203876494932a", size = 333612, upload-time = "2026-09-21T17:56:40.041Z" }, + { url = "https://files.pythonhosted.org/packages/76/e1/9509dafc1fc68948e75842a74533ddfa64af57f2b17810e9cacfa68a829b/multidict-6.9.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1fee9a16d88a1c4865610de31ef5c666671020d7a81d1f510eaf3c97d00ebeba", size = 304246, upload-time = "2026-09-21T17:56:42.313Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/96b93808e1bec0b51d49d89859e49b82a94f7b2e58eca0fc44ffcafd3ae5/multidict-6.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7814bbee202acd3bd240204c17d8b87a4c48c81064fd8674dbe527d94d5a4290", size = 321983, upload-time = "2026-09-21T17:56:44.399Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1c/08e5184df026b9d8e05a6dce5da22628e46bc4a7c7f03b8bf3c6939a8c46/multidict-6.9.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:95f273bea318a194f656527ee2ed19494327bc500b8e87d9358e3222579aa28d", size = 315927, upload-time = "2026-09-21T17:56:46.208Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5d/9ff39e7387f6fcc9a81af5dbf055fde08149849a04f8df10ca5b086b0d39/multidict-6.9.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:73bcafa21a78d0776b3ee7cd2a63c66f968eb7db8e8d594e32d7329950f6e828", size = 336827, upload-time = "2026-09-21T17:56:48.021Z" }, + { url = "https://files.pythonhosted.org/packages/5a/be/30fbb2cab22203128928066de94be247dc9a3230bf2bfc54437ac3b5f9f7/multidict-6.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1a938761c77e0e6edb0c93d02f4e988d44a69e5195e5a3b893e5553311347132", size = 336317, upload-time = "2026-09-21T17:56:49.778Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/2480aef6b7d8e7ab89b064ae14f12ec069570dab3a5c13e0155912293247/multidict-6.9.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:37245ca4105386194dd1d292a6f2aae09bfe1bd7ac6f9ec25093e3cf8e9b143b", size = 303258, upload-time = "2026-09-21T17:56:51.829Z" }, + { url = "https://files.pythonhosted.org/packages/4c/04/dbe59cf4ea3778600e8e70e30b31aa9118ad6da2844bc9f717804cbaa000/multidict-6.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f0700527dd5bfa8b7204b08330542f4f388899d3c14d885d8a368992e0eb562d", size = 337232, upload-time = "2026-09-21T17:56:53.537Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8c/abe55548f06f12878588f08eb803c5a391283f01243f784cb00adac79231/multidict-6.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6b7e54fd883671d1a8810704851c044b7173287c552b9f5c3d9e0eb9f00ae194", size = 330261, upload-time = "2026-09-21T17:56:55.335Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f1/ba67f668478f152bdfa18abe72e7588bd078bf8b42c172fcf542fcf45826/multidict-6.9.1-cp314-cp314-win32.whl", hash = "sha256:e81ae656b9935ac4528a71f96bb7a14d949778ed1897c573d3e7ebb9187f8841", size = 51715, upload-time = "2026-09-21T17:56:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/014bb2128aedc8157d2848f0ec8a0209c6b822fb88deea012834e1c4a4e8/multidict-6.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:acddcac38adc8342ba48aba98896faa7928854bebb62542362138655b5367ee3", size = 58621, upload-time = "2026-09-21T17:56:58.531Z" }, + { url = "https://files.pythonhosted.org/packages/66/34/8f43c03c2d8821a2320b8c560d8a49d0be2920627edfac3f546922f91969/multidict-6.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:32217133dddc58c927805cf6c0731d8144584176b768042ee886d51e71860bc9", size = 53959, upload-time = "2026-09-21T17:57:00.15Z" }, + { url = "https://files.pythonhosted.org/packages/08/64/4f2a5eeea10b6d42634ba168ec6efc732ef218772e57b8239cd485c202f6/multidict-6.9.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0b2fb8c349d1103863750b5d8cb5ace766917f4b35f3d883c8f778853eaa9f76", size = 107694, upload-time = "2026-09-21T17:57:01.785Z" }, + { url = "https://files.pythonhosted.org/packages/32/ce/c68d08ac2096c1528ff20d77fd10f7e401db3e534ac5a1c7726e36a77c2f/multidict-6.9.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:56d834b74c993a7d7cb2b8ab33a0d55c3e0d4a3d2f2da2808a4ad3d79189711b", size = 64766, upload-time = "2026-09-21T17:57:03.52Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9a/9f5c270c88fe289b4876fe28f9932a70e015a7916aff1e5b0325f7597b11/multidict-6.9.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:783ba7d845d79ce976afd9c1e91a4e5714671defa198ee789e8b23316083a485", size = 62723, upload-time = "2026-09-21T17:57:05.104Z" }, + { url = "https://files.pythonhosted.org/packages/7c/63/c9a0b131354dd949426166cef712d708f436a8cf261114f8d5d2aec440ca/multidict-6.9.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d718fa1b5f0d0dd75e86fbbc5b0c93ea3a5d65216c85c61cd5d7cdddfe08455", size = 290445, upload-time = "2026-09-21T17:57:06.687Z" }, + { url = "https://files.pythonhosted.org/packages/9d/41/ed27d1d20ba91f4e13e8f7dcfaa592614ae0e1d5f45e03171d23c3b098ac/multidict-6.9.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a313bad717dde740959d50850c315b75fd4eb0c5e6b4dc8535db0f1c369be125", size = 304375, upload-time = "2026-09-21T17:57:08.717Z" }, + { url = "https://files.pythonhosted.org/packages/66/6f/a7b26167173c3b73d6e5ebb0856c5154ad005156c3a2fa4062329921819c/multidict-6.9.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ef01d29fca550ab871fd99154f82c6472aacf8e7def272dfb07b460123850390", size = 281746, upload-time = "2026-09-21T17:57:10.713Z" }, + { url = "https://files.pythonhosted.org/packages/34/1d/da27bdd49b0cb84263288f5f48dbd915f2d17fd228fee2078ca607e80277/multidict-6.9.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f3bd290711c6e9486173a6ee7cd4e7f00c3971c7908c1ec1b6e5437c5e4c6f9", size = 311499, upload-time = "2026-09-21T17:57:12.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/36/ab0299a7abf53e38ff75d96c64480f1e2ff8edde985f93f7a1ad5e08bd94/multidict-6.9.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:81cdc537e0a42e3c0170752fcadbe450246d5c3b4b7231d6eb9672456605ac94", size = 313553, upload-time = "2026-09-21T17:57:14.548Z" }, + { url = "https://files.pythonhosted.org/packages/5a/44/e21be702efc9c9ba097c8be874c68860b1cb6cf9c85611263039bf95b37e/multidict-6.9.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b193bf7a443c97d81c47052f60c486071a4bdef4a573fa2514f920089414d45", size = 299898, upload-time = "2026-09-21T17:57:16.192Z" }, + { url = "https://files.pythonhosted.org/packages/00/8d/e93bc0dc947c7f872e502cfaa7ad9d98f001e1c93cfa6f4940457a6e187a/multidict-6.9.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7a0c98f6a636adf0d7edd60c61589eaf52d149239af754d0bfeb0effedba53a8", size = 273054, upload-time = "2026-09-21T17:57:17.793Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c9/945b44493fbe7af26ffe1e43c506b376daeab070fc1a0923bef9bbf572eb/multidict-6.9.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6e6b7e3a1520c39a2772f414cd9ddf5995f77e4e823dfa1522af383addd465a3", size = 294751, upload-time = "2026-09-21T17:57:19.631Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/0969a9b38b814e5fa3af1b0a57708c49b3d9b3d55c208bac6e98b87bb028/multidict-6.9.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ca65cced0d67a9039e93bcd98a369920e499bf98296844ff56ead01c9085321f", size = 284523, upload-time = "2026-09-21T17:57:21.313Z" }, + { url = "https://files.pythonhosted.org/packages/1d/1e/c32ddf53234c228b1a374ddabca19f542ac7f32752f5155982abe2304833/multidict-6.9.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:372c063f37480f62c1ae32dc3a1a0a5942b180c883f99789075a8a8ec3c4e709", size = 290275, upload-time = "2026-09-21T17:57:23.206Z" }, + { url = "https://files.pythonhosted.org/packages/5d/09/7a99a3daafd987330abb865a2d36e432fd8bf18e790ddda55c5de15eb98f/multidict-6.9.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:827c92145b3b976b39430129c89d213b250dacbe5fce678e9a03940e6e848983", size = 303350, upload-time = "2026-09-21T17:57:25.086Z" }, + { url = "https://files.pythonhosted.org/packages/2e/09/7e6ebaecc4e226d7fe27973c271d58b75c14c24e84c23736d21dc39997dd/multidict-6.9.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9b0124b9c17e9890f0819b2e7a5f65ec9a2f5aabd6c8e7ad090c1675cf70dee6", size = 272232, upload-time = "2026-09-21T17:57:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6e/420e9e879b21cbdb5036214ee238efabcfab7bf262d3fc124132050f79ff/multidict-6.9.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:23136f5a564654eb61061ec6d5620a4c1ea32c8f552b65e9982a12b72bff601b", size = 300525, upload-time = "2026-09-21T17:57:29.004Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7f/c6b0896850b3ceb190ca302760d63148843371f027c5dde3d1d732343a08/multidict-6.9.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f2524ec55b3e65cbe235a8b3c36e2af3b635be02ed05e20c94e70c5c943c009e", size = 295933, upload-time = "2026-09-21T17:57:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/29/f2/f0ff3384a756227741c72f4ee94cadf1f9900df0ae961e48639f96115b1c/multidict-6.9.1-cp314-cp314t-win32.whl", hash = "sha256:35ba0263bae5dd3ad5aad767cc9afc01a8598c7dae30f1b3b2de98b1b32c28bd", size = 57776, upload-time = "2026-09-21T17:57:32.835Z" }, + { url = "https://files.pythonhosted.org/packages/8d/87/013e1eed30ad46bec1eb68947bc9caf55ba2fd0d6aed04fe964e3b44c23b/multidict-6.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:7c8d5882ba25ac0282258be435d8a05aa0cbcacfce15799154a338f847f159b9", size = 64881, upload-time = "2026-09-21T17:57:34.489Z" }, + { url = "https://files.pythonhosted.org/packages/7f/95/64dd049bb4c53426e2fee7afb874daaa8b4426c41878785883a94511ecf8/multidict-6.9.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ac348379cf4de5538a0a213be1532d289aa801ec5d267c5909446b9ea2f8e2c3", size = 58582, upload-time = "2026-09-21T17:57:36.19Z" }, { url = "https://files.pythonhosted.org/packages/be/59/e26cb779be4c591d1a910f59d29aca9fba4de70349840a833beba2652371/multidict-6.9.1-py3-none-any.whl", hash = "sha256:7bf6478188f4e47bf5686e8a33da4ae28bf43b1b2528d9ee144d28492bfac60b", size = 19176, upload-time = "2026-09-21T17:59:03.501Z" }, ] @@ -1453,15 +1705,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/69/ee613f74085ca7103f79cd08d579c4f3177d1d26e5d3d9528d2d6536a707/nbformat-5.11.1-py3-none-any.whl", hash = "sha256:cc6698fa75f4fab8755ead786317815f13a6fee3b53311c0abb1a8b51d52f7ec", size = 79849, upload-time = "2026-08-17T08:10:50.18Z" }, ] -[[package]] -name = "nest-asyncio" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, -] - [[package]] name = "nest-asyncio2" version = "1.7.2" @@ -1528,6 +1771,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/ae/ad6645abc7a3510fe48e8ea1ab4598166f500057ef4ebf38bfad4f1577de/numpy-2.5.2-cp313-cp313-win32.whl", hash = "sha256:4f9744f9fbdcea0bc552e8f19e1f141f811a3f9bc2be2cc6e86d982cab23e3f4", size = 6070204, upload-time = "2026-08-09T13:45:54.111Z" }, { url = "https://files.pythonhosted.org/packages/15/20/f3489f86d81ea460b2bcdceaed094142ca6579f6be0ec527b781d39afe68/numpy-2.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:85aaccb24182c25df891ad0ec333585967e115269d5f1b17f2c9ae005bc96657", size = 12460532, upload-time = "2026-08-09T13:45:57.167Z" }, { url = "https://files.pythonhosted.org/packages/d5/21/35b31dde1b283b79de828b80f876afd8c94e28fe1e9c375f89e261cc4c0d/numpy-2.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:bd68ece1553d2023c09a4226d9e41c586ad2d20594d1a456186c33513d2cb3f2", size = 10396725, upload-time = "2026-08-09T13:46:00.478Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f8/c3b222bf075b50afd8e949a07a15c4b312a4a84bd8102a332bcd953cbbb4/numpy-2.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d787cf769c3baeb5f6235e778edb52c08dfa923789b5958f28e6450f96107cb1", size = 16885180, upload-time = "2026-08-09T13:46:03.939Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/2c1d4b1987795a92b5bbf7c24fe249ab96aa2573ab0d7604802c189d7b86/numpy-2.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:24b9dc2e3d84aa58523798805194e23e736f3f6ce2d1a5b92583ae734e6dbda8", size = 11907878, upload-time = "2026-08-09T13:46:07.045Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ee/d08226fc858044355983a6e5b94f08ff6f3969e0a2b160a4a89f0ddb3445/numpy-2.5.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:9e9413326d726c2545bfa65d2c0876871e8d8386e77f992c1d426e180bbd4323", size = 5354922, upload-time = "2026-08-09T13:46:10.04Z" }, + { url = "https://files.pythonhosted.org/packages/94/f0/6d3d933056440ebbc5e6bad92065fc6c26a48a84a36b1208580e94eea76c/numpy-2.5.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:60e902ac295855348a5ca2ea4c89108989a9f5fddfad3dfc0a8f36b10358567e", size = 6679168, upload-time = "2026-08-09T13:46:12.275Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3b/ecd49dd90033cceb2704d88ca905d4d7d89b0e8c739608754ffd325fa820/numpy-2.5.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e500dc868e9313530ce12ba470fe50ff3afe3d62993ed6eff652dacd555b65", size = 15624501, upload-time = "2026-08-09T13:46:15.322Z" }, + { url = "https://files.pythonhosted.org/packages/c7/99/461bd36dbdfac6c1c53efa370bd55a83227542d0d118f1677dbf1a3dacd5/numpy-2.5.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318b9a4c845dbea06708a29c84ee429cc3065048db34cdb799047643492050ee", size = 16713701, upload-time = "2026-08-09T13:46:18.949Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9c/2b251df9e8a5d647b62b0cbc1b90a91850c1cf4859ecb532fd0b4eacff6c/numpy-2.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34c319e2963be042673fb46570501b2f06c41924e17e3563d58646b4380dfb68", size = 16986065, upload-time = "2026-08-09T13:46:23.006Z" }, + { url = "https://files.pythonhosted.org/packages/8f/25/20de43f53ff1390534a124475055a19f01fe10c920a0fd11b8e18d6d6052/numpy-2.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f06571a052127dc1b4e8b83029b4d1b20daa2b64a31cdd181fc6bc774e9000eb", size = 18470031, upload-time = "2026-08-09T13:46:27.102Z" }, + { url = "https://files.pythonhosted.org/packages/56/5e/0c577ca308d6da5eb79b546ba10bbe5b60148192194e2da060913b1de4f1/numpy-2.5.2-cp314-cp314-win32.whl", hash = "sha256:2cc779226e476d1e1f08c74068c419e60f41a9e0e069c92f6671d31d5c985e98", size = 6121028, upload-time = "2026-08-09T13:46:30.046Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/7bcbd5b11f94199073320410cddcbb80cee62415bfeb540874b265c2d922/numpy-2.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:7587f53dfbd5edc0f7b87c6217b4c6d2d1f2ef9c3da70bc1315e7db5f8d7ec9d", size = 12597627, upload-time = "2026-08-09T13:46:32.886Z" }, + { url = "https://files.pythonhosted.org/packages/87/bc/4d0b06fba0da90ccc75af62823cb9dcedb6c9ea0cffa058cb2c9ee773a77/numpy-2.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:3e4c367352d3747784248a227fbec218e193b56f7e6692e3b64fc805478ecfdf", size = 10680414, upload-time = "2026-08-09T13:46:36.036Z" }, + { url = "https://files.pythonhosted.org/packages/cd/17/f429aac9dc08833a0d0f188eba38c532a751b1a1f2ca6018a37b455cb321/numpy-2.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b879fb674276e331513fb136b78dbc6bd3c848309e0d841cfd63be3896c4cfc1", size = 12026967, upload-time = "2026-08-09T13:46:39.084Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9f/d0849de96a2a4ceaa16662f18ee13eaa9c0aa418269fdc8c4857c56b11da/numpy-2.5.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:fd0d703772bba096843785bd38371e31bb4a0c1151497ad5739d182114a73f7f", size = 5473874, upload-time = "2026-08-09T13:46:42.075Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/8df216d4a4a5422a3de045301cf7df8ea47286d76f5cb7160b0128ac26b7/numpy-2.5.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:3a2f061cebd9e3d23bdcfaaded5e2293a4c6a5b60fa42df85d410a725ce621bf", size = 6789276, upload-time = "2026-08-09T13:46:44.387Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3a/20d7e9891c4ddfadd6ff8d95bf4b29f353d8e1770553de2099880551dfb9/numpy-2.5.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6df895598c0edcb41030126c89e0f353b07d93238116143b7405e937359736c4", size = 15659154, upload-time = "2026-08-09T13:46:47.538Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d6/f3aa3d2688bf501b858835c6bd087ae9b51a56ae6fca8e2b0990abd177af/numpy-2.5.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ab3d4a901f844ea836c3e80bf463c6a27d7f3c14e8e292fcf28d348b25b9bce", size = 16748909, upload-time = "2026-08-09T13:46:51.442Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8f/1c5cae8d2baf86ab802ae97a00be55bc7e21ebc11b12bbc33376c5f05342/numpy-2.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cebc2d6dbb605a7703d59751dea4bd6b0ab127a5a4338a6f432df1936fef8b26", size = 17027685, upload-time = "2026-08-09T13:46:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/5c/27/71d3467404aedc1c24ce79610f91b52b0b0f466c43a701aa56fc75c145ab/numpy-2.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eaca7ff36f0f52e2111ec71f169d8fd3e889e7ddc0d2592e0d703fd8d3ce8fac", size = 18501181, upload-time = "2026-08-09T13:46:59.09Z" }, + { url = "https://files.pythonhosted.org/packages/14/2f/42921d27c40aea7e077f4a423ae509fd9220b028cd787bafefd8ab2b3a5f/numpy-2.5.2-cp314-cp314t-win32.whl", hash = "sha256:ddf47472af2e4280d79bac82304f5e80150211f1b9e614b760061d5fdfbb6eba", size = 6271085, upload-time = "2026-08-09T13:47:01.903Z" }, + { url = "https://files.pythonhosted.org/packages/75/e6/bad5f5d56de9b1971bac959963dda276d35c40f1854475005434bbe08692/numpy-2.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:44ef9675d908e65f9953063837c3277730f3f4437615a4cdab67b366cabaf884", size = 12787971, upload-time = "2026-08-09T13:47:04.963Z" }, + { url = "https://files.pythonhosted.org/packages/df/05/f608795cb34391acd67e38d94a3c36abd8d8576293a3a80727d7595c372c/numpy-2.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:eaa088384c46f519dacb93b7ec483a6d6b19a4a2085ae4f25ab9b1c43d387d1e", size = 10750306, upload-time = "2026-08-09T13:47:07.976Z" }, ] [[package]] @@ -1585,6 +1849,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/8d/36dade89b49e4f9d5cbdbe863772581f98c0c6d78fc39ad4c557f6f2e17e/pandas-3.0.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:db172144bb56422bd157812f3b021eacc255451470b31e2c633c349490a1cfee", size = 11989004, upload-time = "2026-07-22T22:18:42.208Z" }, { url = "https://files.pythonhosted.org/packages/9c/ba/18c4ec8a746e177da05a9e7a7963781d8ea195780724f854601b6ebd6b78/pandas-3.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:0d298e951f23016ce4699951d044ae6418dbc91bf68cefca0f77666fcbb4e5c6", size = 9826896, upload-time = "2026-07-22T22:18:44.539Z" }, { url = "https://files.pythonhosted.org/packages/de/ec/28a57266b753799a87b8bc79e7887ac6fd981b8c6d2978a0b7e7b6bd708c/pandas-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:66266d3442a5e8b3c90274c2b8b230bee42dd1c286bc822cc2f9f2c7e12b883e", size = 9094790, upload-time = "2026-07-22T22:18:47.468Z" }, + { url = "https://files.pythonhosted.org/packages/51/2f/cf6aae281264f4463f0875bcbb15fd2bb6d291cc535187dad1732475e4a9/pandas-3.0.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2f264fc46911cc8131a7322a16199bbf8e353d27c10bb211f5bd0c814324dc36", size = 10390034, upload-time = "2026-07-22T22:18:49.818Z" }, + { url = "https://files.pythonhosted.org/packages/06/ec/5189518c7a7659c4bdcc6b1eb32c46c6f3c86b0661ffd84143d1112c7732/pandas-3.0.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:53730687fcd161883b24e10411c06d6a4c0f2275d2faf3bb2bc25deb4ba8007c", size = 9980065, upload-time = "2026-07-22T22:18:52.249Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/598503ce8d7e3c35601e0747ba288c7864baae66380725bc12f13f884dfe/pandas-3.0.5-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:960d3ebcf249f75206899fcd2c6de53f736b7265759ced0d3e559df0b8b709b0", size = 10545532, upload-time = "2026-07-22T22:18:54.813Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/ceae2adf7034e07e9910299fe412e1819c4f0dd520700a888bcb03625448/pandas-3.0.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e94c2c5ca43bd3ca32bf64d32308887b65e5f9bfd8023ea52755107a999f93b", size = 10963120, upload-time = "2026-07-22T22:18:57.42Z" }, + { url = "https://files.pythonhosted.org/packages/66/25/86e0f4451874eb79e688deeebe3c451fec4557f8952005818d800ee8ac7e/pandas-3.0.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e819dd5f62966b481a8cb649d3299ebd886a1ea91ed5a99bf7ce77c98d18ab94", size = 11563178, upload-time = "2026-07-22T22:18:59.729Z" }, + { url = "https://files.pythonhosted.org/packages/f3/45/8643daa3b4147e433adfcccefdd0380d3aad79d86b15d8999730fe1944d5/pandas-3.0.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3c5ed2e7c06e91d340dfd091d7934f9bc82e4a36b95f647f090b9d1c9ac649da", size = 12028708, upload-time = "2026-07-22T22:19:02.164Z" }, + { url = "https://files.pythonhosted.org/packages/96/58/ad979ae617615576e8aafd569c9d4b62f1191d896e38f51d66ba06f3b89a/pandas-3.0.5-cp314-cp314-win_amd64.whl", hash = "sha256:cd8f7c6dc98527058ee6264219343f5392240a6f1bfa654fc5d79023020d0c92", size = 9951806, upload-time = "2026-07-22T22:19:04.596Z" }, + { url = "https://files.pythonhosted.org/packages/69/32/7ac03886b304049a9d2625ee88f59af760d8a93bd30ed9239bce7b9869a8/pandas-3.0.5-cp314-cp314-win_arm64.whl", hash = "sha256:5183427f5a8156d480f30333777bc978be93650a49a7c01db26adffe95b31e85", size = 9238297, upload-time = "2026-07-22T22:19:06.836Z" }, + { url = "https://files.pythonhosted.org/packages/be/ed/1d1f2ee5547d5167face2376d11c8b2a4c7bfff5a416ee7a9046891fab1e/pandas-3.0.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:303da736987d481074ca720ada325f8bd80c64ebc2d45ed79b29df3aaa4a26ca", size = 10849690, upload-time = "2026-07-22T22:19:09.391Z" }, + { url = "https://files.pythonhosted.org/packages/57/55/17e17152e98fbb0c4b1e562bc65387a2f20a80db0f4a86bf8d3a0e4248d4/pandas-3.0.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3b2801bbb049d0136f6c213eae02b5fca969384fc2064dd728d8620552aa49da", size = 10509945, upload-time = "2026-07-22T22:19:11.773Z" }, + { url = "https://files.pythonhosted.org/packages/88/90/817d44dbf83facf9556f33576d9af0a241981e7bb5c00606c0bcb5df8dda/pandas-3.0.5-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cce3a9d11d2b1f82c69a27ec1f4948a170e2c403c4bbfa8cca62e3fdebe2ef3a", size = 10392197, upload-time = "2026-07-22T22:19:14.024Z" }, + { url = "https://files.pythonhosted.org/packages/f1/da/889f00c0a6f5aa1545add70abbf01502dff87ab577adb855bd631c54d2f2/pandas-3.0.5-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef01af4d8dc6cd2c8d6c7736f149574ef93fe043811eeb5e445f2647154b5040", size = 10862726, upload-time = "2026-07-22T22:19:16.351Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/f1e934fb3c98fce859c6147c6785816c7b5b9ab7821115c5d8c4de9842b9/pandas-3.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e2759e890db96dfcffdbd9b86c3c2cb6afaf58def482820317e06163ec1066cd", size = 11414864, upload-time = "2026-07-22T22:19:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/fe/be/d448af7d657d82e1888dd8551f79c6d6fb161080b5b9752d84d910ec2319/pandas-3.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b58b1b39d46a5862e3fb18f50d1a201398619d16a0f9f73f57eea5583cf0e63c", size = 11925105, upload-time = "2026-07-22T22:19:21.515Z" }, + { url = "https://files.pythonhosted.org/packages/29/c1/ccb4238212c8c4f496c584f3044d94e0c030ed8e1d68999db46c91c2242f/pandas-3.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:1c10461f6eeb35d8f05b6184c65c8b9991663b66c46b1d559b682cb34ae7c6ea", size = 10387612, upload-time = "2026-07-22T22:19:24.257Z" }, + { url = "https://files.pythonhosted.org/packages/d2/cf/6a51b2c38980e04c279fd2fa908a1b0982064e860444acfca4ec2e2c8359/pandas-3.0.5-cp314-cp314t-win_arm64.whl", hash = "sha256:3c5015fd1730fbf883647e88068176c839c102cea883ba1769a6f4593bfc1f8c", size = 9509776, upload-time = "2026-07-22T22:19:26.694Z" }, ] [[package]] @@ -1713,6 +1993,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" }, + { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" }, + { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" }, + { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" }, + { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" }, + { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" }, + { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" }, + { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" }, + { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" }, + { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" }, + { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" }, + { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" }, + { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" }, { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, ] @@ -1728,6 +2042,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, @@ -1766,6 +2086,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/19/7dc003b32fe35024df89b658104f7c8538a8b2dcbde7a4e746ce929742e7/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:98062447aebc20ed20add1f547a364fd0ef8933640d5372ff1873f8deb9b61be", size = 3048968, upload-time = "2026-04-20T23:35:16.757Z" }, { url = "https://files.pythonhosted.org/packages/91/58/2dbd7db5c604d45f4950d988506aae672a14126ec22998ced5021cbb76bb/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:66a7685d7e548f10fb4ce32fb01a7b7f4aa702134de92a292c7bd9e0d3dbd290", size = 3351369, upload-time = "2026-04-20T23:35:18.933Z" }, { url = "https://files.pythonhosted.org/packages/42/ee/dee8dcaad07f735824de3d6563bc67119fa6c28257b17977a8d624f02fab/psycopg2_binary-2.9.12-cp313-cp313-win_amd64.whl", hash = "sha256:b6937f5fe4e180aeee87de907a2fa982ded6f7f15d7218f78a083e4e1d68f2a0", size = 2757347, upload-time = "2026-04-20T23:35:21.283Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/708c0dca874acfad6d65314271859899a79007686f3a1f74e82a2ed4b645/psycopg2_binary-2.9.12-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6f3b3de8a74ef8db215f22edffb19e32dc6fa41340456de7ec99efdc8a7b3ec2", size = 3712428, upload-time = "2026-04-20T23:35:23.453Z" }, + { url = "https://files.pythonhosted.org/packages/d6/39/ddbea9d4b4de6aca9431b6ed253f530f8a02d3b8f9bcfd0dbfe2b3de6fe4/psycopg2_binary-2.9.12-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1006fb62f0f0bc5ce256a832356c6262e91be43f5e4eb15b5eaf38079464caf2", size = 3823184, upload-time = "2026-04-20T23:35:25.92Z" }, + { url = "https://files.pythonhosted.org/packages/bf/a0/bc2fef74b106fa345567122a0659e6d94512ed7dc0131ec44c9e5aba3725/psycopg2_binary-2.9.12-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:840066105706cd2eb29b9a1c2329620056582a4bf3e8169dec5c447042d0869f", size = 4579157, upload-time = "2026-04-20T23:35:28.542Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/d4e3b2005d3de607ca4fbb0e8742e248056e52184a6b94ebda3c1c2c329b/psycopg2_binary-2.9.12-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:863f5d12241ebe1c76a72a04c2113b6dc905f90b9cef0e9be0efd994affd9354", size = 4274970, upload-time = "2026-04-20T23:35:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/2e/42/c9853f8db3967fe08bcde11f53d53b85d351750cae726ce001cb68afa9c1/psycopg2_binary-2.9.12-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a99eaab34a9010f1a086b126de467466620a750634d114d20455f3a824aae033", size = 5895175, upload-time = "2026-04-20T23:35:33.584Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/b82b5601a97630308bef079f545ffec481bbbc795c2ba5ec416a01d03f60/psycopg2_binary-2.9.12-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ffdd7dc5463ccd61845ac37b7012d0f35a1548df9febe14f8dd549be4a0bc81e", size = 4110658, upload-time = "2026-04-20T23:35:35.638Z" }, + { url = "https://files.pythonhosted.org/packages/62/8c/32ca69b0389ef25dd22937bf9e8fbe2ce27aea20b05ded48c4ce4cb42475/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:54a0dfecab1b48731f934e06139dfe11e24219fb6d0ceb32177cf0375f14c7b5", size = 3656251, upload-time = "2026-04-20T23:35:37.854Z" }, + { url = "https://files.pythonhosted.org/packages/c4/29/96992a2b59e3b9d730fcf9612d0a387305025dc867a9fc490a9e496e074e/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:96937c9c5d891f772430f418a7a8b4691a90c3e6b93cf72b5bd7cad8cbca32a5", size = 3301810, upload-time = "2026-04-20T23:35:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/56/ad/44b06659949b243ae10112cd3b20a197f9bf3e81d5651379b9eb889bfaad/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:77b348775efd4cdab410ec6609d81ccecd1139c90265fa583a7255c8064bc03d", size = 3048977, upload-time = "2026-04-20T23:35:41.806Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f2/10a1bcebadb6aa55e280e1f58975c36a7b560ea525184c7aa4064c466633/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:527e6342b3e44c2f0544f6b8e927d60de7f163f5723b8f1dfa7d2a84298738cd", size = 3351466, upload-time = "2026-04-20T23:35:43.993Z" }, + { url = "https://files.pythonhosted.org/packages/20/be/b732c8418ffa5bcfda002890f5dc4c869fc17db66ff11f53b17cfe44afc0/psycopg2_binary-2.9.12-cp314-cp314-win_amd64.whl", hash = "sha256:f12ae41fcafadb39b2785e64a40f9db05d6de2ac114077457e0e7c597f3af980", size = 2848762, upload-time = "2026-04-20T23:35:46.421Z" }, ] [[package]] @@ -1849,6 +2180,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, @@ -1890,7 +2251,6 @@ dependencies = [ { name = "loguru" }, { name = "markers" }, { name = "mcp" }, - { name = "nest-asyncio" }, { name = "optional" }, { name = "psycopg2-binary" }, { name = "pydantic" }, @@ -1941,7 +2301,6 @@ requires-dist = [ { name = "loguru" }, { name = "markers", specifier = ">=0.3.0" }, { name = "mcp", specifier = ">=2.1.1" }, - { name = "nest-asyncio", specifier = ">=1.6.0" }, { name = "optional", specifier = ">=0.0.1" }, { name = "psycopg2-binary", specifier = ">=2.9.11" }, { name = "pydantic", specifier = ">=2.12.3" }, @@ -2103,6 +2462,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/41/12fbfd7f36ed2146d8bc9de96c2741296bf0d490b98508496cff322e274c/pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c", size = 6370184, upload-time = "2026-06-04T07:49:36.253Z" }, { url = "https://files.pythonhosted.org/packages/ba/db/36a78e3403099d31d9746d13fdcde5accc43c1155f375a34d15983a479a7/pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9", size = 6914298, upload-time = "2026-06-04T07:49:38.876Z" }, { url = "https://files.pythonhosted.org/packages/84/37/c1697194092b76de9ed47ca124323f02c57ffc8a45c06f88a3d5acaf01eb/pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831", size = 6727640, upload-time = "2026-06-04T07:49:41.083Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2b/1f3cded5822fd49c02f40544cbb5f58c7cfd6b1694869fd476cb6170ee97/pywin32-312-cp314-cp314-win32.whl", hash = "sha256:a77a90fbb6881238d2ca9c6fd797b25817f3768fe78d214a90137ff055a75f5b", size = 6468928, upload-time = "2026-06-04T07:49:43.188Z" }, + { url = "https://files.pythonhosted.org/packages/21/82/3bf86d2e2808902013132e1ce905a7da0da53790f3836c64bf44d55e24f3/pywin32-312-cp314-cp314-win_amd64.whl", hash = "sha256:a4dd3a848290ef724347b19f301045831d8e802fa4464f491b98b1e0a081432e", size = 7024157, upload-time = "2026-06-04T07:49:45.34Z" }, + { url = "https://files.pythonhosted.org/packages/a4/0e/73f6d6800b4f27655abd9e9f6aaeaefcddb2b946e4674efa2bab184a7f7b/pywin32-312-cp314-cp314-win_arm64.whl", hash = "sha256:9fce94568364e0155e6dfb781ac5d95903be8baf28670632beab1b523f300daa", size = 6839598, upload-time = "2026-06-04T07:49:47.613Z" }, ] [[package]] @@ -2117,6 +2479,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/2c/a138491a0afbdb50eb79395577bd326d4b0fbde7209417d1a8087ff2493a/pywinpty-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:2c6008fb2d3774b48693b2fcb7f2cc317ade9dc581289a964ffeeaf81307c9b5", size = 815518, upload-time = "2026-06-10T23:42:02.363Z" }, { url = "https://files.pythonhosted.org/packages/6f/15/54400049a380582acd1282665c70fcf11e0bd3713679aca78e24c3aae738/pywinpty-3.0.5-cp313-cp313t-win_amd64.whl", hash = "sha256:22ce1b780d89821cc52daf6eac0708af22d93d000ce9c7c07e37489db8594598", size = 2089920, upload-time = "2026-06-10T23:44:13.395Z" }, { url = "https://files.pythonhosted.org/packages/94/0c/6f24f3c0799f502259b24bdf841a99ad2b0d59df5c2525b4e2a286d14be2/pywinpty-3.0.5-cp313-cp313t-win_arm64.whl", hash = "sha256:9c2919a81bc5cfb09b86fc5a002112b2de95ca4304a07413cbeeb746a1307a5c", size = 814520, upload-time = "2026-06-10T23:43:28.588Z" }, + { url = "https://files.pythonhosted.org/packages/e9/23/f3cd1b1e5fc56517f54452c49f92049e7dd9ffc8a63de22a495581f50d04/pywinpty-3.0.5-cp314-cp314-win_amd64.whl", hash = "sha256:03bb3c16d691d9242267201830bcd0e64a9b663170e9042bc84b210da9de15ac", size = 2090663, upload-time = "2026-06-10T23:43:59.845Z" }, + { url = "https://files.pythonhosted.org/packages/9d/dd/96d6cbfc6d9ddab5c1c2f92c26545ae8997446a2ba7ee2024cd43c81f49b/pywinpty-3.0.5-cp314-cp314-win_arm64.whl", hash = "sha256:89c5c6ef08997a3b4b277b214a35fe15cab4dd6d119f0140aa71df5b1168fdbc", size = 815700, upload-time = "2026-06-10T23:40:50.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/36/d98087bce0acaa4cce7f196103cfa7be3f63ce65f52473bb3e38784ae5d9/pywinpty-3.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:7b566165e0c5fdd6abe167a5ac8b954be6a843eb55a85946576d6bc1dea03d6d", size = 2090093, upload-time = "2026-06-10T23:40:58.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/fd/fe2b0db922ba052ce3976a08f3fc05d0c05047c8b4ebb6102e832b8ef563/pywinpty-3.0.5-cp314-cp314t-win_arm64.whl", hash = "sha256:24366280a8aa677323da87bec729cb3ea3b35367386cece0978bdc6e4695c690", size = 814517, upload-time = "2026-06-10T23:42:34.946Z" }, ] [[package]] @@ -2145,6 +2511,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] @@ -2178,6 +2562,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, ] [[package]] @@ -2291,6 +2685,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, ] [[package]] @@ -2482,6 +2905,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] @@ -2762,6 +3203,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/8d/b1b35ed7903da6669b1d367cb2c09436acd4ff508029b4f39a0c0c2058fc/yarl-1.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a66db89ea473abeac4b70523cafd94db3772380e565f9d28af7a179b7af71fa", size = 117276, upload-time = "2026-09-15T19:32:09.401Z" }, { url = "https://files.pythonhosted.org/packages/3a/8f/4db01cef62caff0d7a4593ed694fb8a41a27a11158cab80d290221f13e57/yarl-1.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f51020b2eb8a003c84925638ec63c21a750a4bddd3a22ec8eac6a742dadf1b9", size = 101945, upload-time = "2026-09-15T19:32:11.545Z" }, { url = "https://files.pythonhosted.org/packages/c0/5e/3ce00497c5c0babb74d4130c10c3828ccd215b4819d12020c42429f991ac/yarl-1.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:b10dd0557ba422715b5206b3743192135a6022acca8baec51aa127d0a75db8fe", size = 97270, upload-time = "2026-09-15T19:32:14.127Z" }, + { url = "https://files.pythonhosted.org/packages/80/cf/54023edfab7aa773b860503db0c56e962ccab0922803ee97988c176ea090/yarl-1.25.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a9ca696eb02e5c02a8afd872ada510eba9b7fe6e68b9572c2e9a9b1941e31e2e", size = 143975, upload-time = "2026-09-15T19:32:16.416Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a8/e6c1be0e6761d0f2d10bbf33a3e1e02b99dc83874d92945d7b461a72481e/yarl-1.25.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a5877f2255aab518ebe528289037699201d5dc5f045f2396cb30aa02db22f57f", size = 104018, upload-time = "2026-09-15T19:32:18.364Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bb/dda344765ffd3430afe1a1c66c866a57fae67786537d4f14607df6505ac1/yarl-1.25.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7a5c3115595995779ee21f2567035793911c3802a43c74f3fbb0314929ec67ac", size = 104156, upload-time = "2026-09-15T19:32:20.459Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5f/ed1538bcd06009fe990d6d283dd7667f639e62a81e35c6d8c6ef6c08fb3c/yarl-1.25.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77e5099b99b37f3cf79c246998ca9f7313a78054cd1809ec46bc1afad47e1c4c", size = 116025, upload-time = "2026-09-15T19:32:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/a2/af/2185daf56b99830d3356ecfada46faaa49945de6626e842b7728088d4980/yarl-1.25.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6efaf45df6a849cef613a03a94c845647456662f85438c886bb67a9c027c8c2c", size = 106985, upload-time = "2026-09-15T19:32:24.749Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/bc1ae564fb4b04a30b6a8f250e787772581c57e4c3d5cf07ac3359de3103/yarl-1.25.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5f90e44653c4e0f78501ed9bb7d3fce835a8d62b7c6ed0cb16557534087e743", size = 123030, upload-time = "2026-09-15T19:32:27.084Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3e/e2afcde10d74e53b3fa889960991efb3019beda2b1682a01de720a302056/yarl-1.25.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:632da579b2d879f6bad20f2cfa35ded1efe2f4f77f8abb26a6234a5b236acd2f", size = 126765, upload-time = "2026-09-15T19:32:29.332Z" }, + { url = "https://files.pythonhosted.org/packages/a2/be/415b00c0fe5a0615b062a456b26623d7ec91c2bee20faea1a14045aa0469/yarl-1.25.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:30eec96e8a91bd588ce897c9543f6d5d8d34b28fbcba28a4dedf20ebeae9fe57", size = 117199, upload-time = "2026-09-15T19:32:31.49Z" }, + { url = "https://files.pythonhosted.org/packages/97/27/3d8c63ddd3e8bcfd033748ab93876678ce59bacd66e4cb1ed851c9c5b37e/yarl-1.25.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:12b6bc4906e11f5e1a1cdcb12296e7afbd366c783cc8073403cd2fb74334e453", size = 115187, upload-time = "2026-09-15T19:32:34.137Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/7a81d0be1a502a26a0d4326c6f2ecb736c824f570ea1c6529f2b0b227b50/yarl-1.25.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9d6ed3d17bccce4c05343e1ca8da13bc5c02c812a4e7282ddd05e8769322d3fc", size = 116085, upload-time = "2026-09-15T19:32:36.438Z" }, + { url = "https://files.pythonhosted.org/packages/f0/69/39fff459916aa0fab42215dc47b759586fd80f94aa56dfc4a7c15ba6e0dc/yarl-1.25.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f38a70074041d3b7e138e452799f5174198bae5bd5ab2000917badf403908c5f", size = 107996, upload-time = "2026-09-15T19:32:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/c0/39/80b9a55a3335590451d9ecf3eb593a8c635351f4c905ef056d7e8a8fd9e7/yarl-1.25.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca89e4e21854ed27ec753297dde84b16c9f8e53b14a4866fb44457d643c19f8", size = 122549, upload-time = "2026-09-15T19:32:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/42/7d/a179c6757818bb59372a4adafd09f7f26a3b4a0f04c3ae404b544c0b0c82/yarl-1.25.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1ab7618921a93767387a4b83776f751588f5b5ae9bb5bc96620e2e2e00bca868", size = 115107, upload-time = "2026-09-15T19:32:43.072Z" }, + { url = "https://files.pythonhosted.org/packages/32/2b/a773ac867e4ab53a98ed98e5cefe3bae31e6f550252ca9d1de266f1a40c5/yarl-1.25.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0ae12ff2b805fa02c4dab838005caef735e39986322698c48588d3beacb65c62", size = 120666, upload-time = "2026-09-15T19:32:45.061Z" }, + { url = "https://files.pythonhosted.org/packages/bc/41/52be6505e85b0f76b4f85b01b5de7e06a0512201abc2c95e14e099549174/yarl-1.25.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90c30ed53546da833c700115c0064c22120d1b1560f474699fd31f22dd668233", size = 117505, upload-time = "2026-09-15T19:32:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/f5/01/349c0386caedbbe488d519f252df54efac8a1459282d466c474bdd84a620/yarl-1.25.1-cp314-cp314-win_amd64.whl", hash = "sha256:acfa7e22aa6c6e7a5996a41d275bfa01efa7ea56ab890590280e9063e2cf5c1b", size = 103446, upload-time = "2026-09-15T19:32:49.615Z" }, + { url = "https://files.pythonhosted.org/packages/5c/f0/8ec63180f77912f0dc4e5a42760cb8c08d20da1d5ace3578a01b84d1f3d8/yarl-1.25.1-cp314-cp314-win_arm64.whl", hash = "sha256:8e7d98cdbb6d71e726f7d525952867096053d1f290dd4e3c50d7d313a136f414", size = 99159, upload-time = "2026-09-15T19:32:51.686Z" }, + { url = "https://files.pythonhosted.org/packages/47/7d/92d2220d6886b70ab1ed8579533ac2af2dfac716d5d929001daff7986df9/yarl-1.25.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d21f0fa80a02d05299207eeaafef345d812ace96d5306e4ef265e1d419a615fa", size = 150071, upload-time = "2026-09-15T19:32:53.911Z" }, + { url = "https://files.pythonhosted.org/packages/64/fc/b245e448124bcda9340df38e3553fa222b50260fca027a84095e9bd8642d/yarl-1.25.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17c9877a89fb6e2bca6f9087eb24cd7fb434653946ef5075e470d23d49b52287", size = 106780, upload-time = "2026-09-15T19:32:56.443Z" }, + { url = "https://files.pythonhosted.org/packages/51/e2/9a6ce2e334ebf218a30335ae76fb1696459430d42f733b8cb0d7d65b84d3/yarl-1.25.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:29273edf1530e397bd07cb784db1fbe0d2590b77569f2e24679a9c0a2d763b94", size = 107361, upload-time = "2026-09-15T19:32:58.827Z" }, + { url = "https://files.pythonhosted.org/packages/ed/70/66e8c76b569b450d16e190f15071c916c3df70b0e33927e415ac497cf0c2/yarl-1.25.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7abffdf37af1cec6a2ad69b827aa84320db5894791bc8ed932dc93fb274b7e9", size = 114396, upload-time = "2026-09-15T19:33:02.24Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/0d82838a05c57fdc05bc8b66e8c92dcc0df15e27463a5f163142d521c682/yarl-1.25.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2239a02249d9326655419e0168a28ca9008938eaab31dc29fc875c217927a6c0", size = 104882, upload-time = "2026-09-15T19:33:04.494Z" }, + { url = "https://files.pythonhosted.org/packages/86/d4/ea08615c4edaa6049a13a2f1128944d068d1893abda7d708d4d7ea01599a/yarl-1.25.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:664ec6a520b74a1df2810666eb67695fcb77fa663e6ea0a25aaf2e529cb24dfa", size = 119485, upload-time = "2026-09-15T19:33:06.583Z" }, + { url = "https://files.pythonhosted.org/packages/1a/82/0898bdce9b1ae403b308b9c733d0d24af4a3464270c2c081f457b16c3e0d/yarl-1.25.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f1c91f5a5980a937ff8e238e98e6897e1ad74a4b1e2c0d68c73b5ffbb3f5c0b", size = 122490, upload-time = "2026-09-15T19:33:08.653Z" }, + { url = "https://files.pythonhosted.org/packages/d1/38/97d79b81c342b78246cfedb74809e68841f3198d21653e10d3232bd9c622/yarl-1.25.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c88edaec8c349ad4c5ad4c486a3defcc4b80ceb2f074436ffa0a87caf5e76a6", size = 115336, upload-time = "2026-09-15T19:33:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9d/2577896554cd310dc470adb6da0b7dd0b435cb63e2565204a7ac240e504c/yarl-1.25.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35dcbea443fafb3eece757ad4e514560ddeb6c34cfae1582c620d7b293d7feee", size = 111825, upload-time = "2026-09-15T19:33:13.204Z" }, + { url = "https://files.pythonhosted.org/packages/29/6b/7ac49d8ba84a5c4bd73415a4c949d22c749cb3762579b3d50e48019a78aa/yarl-1.25.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:882569ff613758cac762a457a5d72d6e211b28d4bcfea89d1d71ea942b02eac0", size = 114655, upload-time = "2026-09-15T19:33:15.553Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/e5942a16723f5b72f9b1297fd5a85a54f6300cd15c0dcb5005b90cd89156/yarl-1.25.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d0f1489233a254bb3643d2f05de7d59019254d81daeca6b9162fe9edef57e0c7", size = 106395, upload-time = "2026-09-15T19:33:17.599Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2d/549fa46240781513ebc47ae7eb418df428a163a2a3d644cc9cbb3ecb7846/yarl-1.25.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f41753a76f4f63927d03a0d8ba8f5ce0f2083bec29a8cfaccc55371b1564b96b", size = 119277, upload-time = "2026-09-15T19:33:19.973Z" }, + { url = "https://files.pythonhosted.org/packages/76/16/4763f78dcdc0b3b9fb3842b04afe72b9320857c6a69300c62a0eab03d119/yarl-1.25.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fb0eb4955adf0579001581f2f71a126e8781ba61bcd120f127b0401163c6c2d", size = 112504, upload-time = "2026-09-15T19:33:22.464Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b4/974e3edfe0d188393ce1cb9de400111c63fe61f4eb3b772a500d84c970d1/yarl-1.25.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a1e32763e641a1566507d90a8d3b19bfc3cc04a9d4e5ae3e32189874ed4b58a3", size = 116243, upload-time = "2026-09-15T19:33:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/b0/aa/157b940428da80c104ca09666a740e51c94963df65d5b112e06b52e4d7a8/yarl-1.25.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65b5b2066651b7432d389e9799d979c703bcc6ef44266bb8153ef54e91e4aab3", size = 115822, upload-time = "2026-09-15T19:33:26.886Z" }, + { url = "https://files.pythonhosted.org/packages/7e/af/19fbdce41412e1b96825544cc52cd7029d3724655d0988237972f078bd29/yarl-1.25.1-cp314-cp314t-win_amd64.whl", hash = "sha256:734f6e5400352ac4254456003d462866c684703570929cff7a7bde015d0cb371", size = 107386, upload-time = "2026-09-15T19:33:29.009Z" }, + { url = "https://files.pythonhosted.org/packages/2a/99/f6431c8968e89be608d74b28ae2d024521b2953f27dd44e0dece5e04f67a/yarl-1.25.1-cp314-cp314t-win_arm64.whl", hash = "sha256:287e99ff5aa4dc1c7630bfc683ded6f106d756c99dec432a2d7f197a784f51c6", size = 102094, upload-time = "2026-09-15T19:33:31.151Z" }, { url = "https://files.pythonhosted.org/packages/54/22/318c7980066769c6bcd9221ed2248294f5698811da099013098c670565ed/yarl-1.25.1-py3-none-any.whl", hash = "sha256:681c758b0490f9e96b78e5fa8e8dc6e648e9185bb6eaebe73183c33ea0c445f3", size = 63617, upload-time = "2026-09-15T19:34:59.616Z" }, ]