Source code for saturnin._scripts.commands.oids

# SPDX-FileCopyrightText: 2022-present The Firebird Projects <www.firebirdsql.org>
#
# SPDX-License-Identifier: MIT
#
# PROGRAM/MODULE: saturnin
# FILE:           saturnin/_scripts/commands/oids.py
# DESCRIPTION:    Saturnin OID registry management commands
# CREATED:        23.11.2022
#
# The contents of this file are subject to the MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Copyright (c) 2022 Firebird Project (www.firebirdsql.org)
# All Rights Reserved.
#
# Contributor(s): Pavel Císař (original code)
#                 ______________________________________

"""Saturnin OID registry management commands

"""

from __future__ import annotations
#from typing import List
from uuid import UUID
import typer
from rich.table import Table
from rich.text import Text
from rich import box
from firebird.uuid import (oid_registry, ROOT_SPEC, get_specifications, parse_specifications,
                           Node)
from saturnin.base import directory_scheme
from saturnin.lib.console import console, _h, RICH_OK, RICH_ERROR
from saturnin._scripts.completers import oid_completer

#: Typer command group for OID management commands
app = typer.Typer(rich_markup_mode="rich", help="Saturnin OID management.")

[docs] @app.command() def list_oids(with_name: str=typer.Option('', help="List only OIDs with this string in name"), show_oids: bool = typer.Option(False, '--show-oids', help="Should OIDs instead UUIDs")) -> None: """List registered OIDs. """ table = Table(title='Registered OIDs' if not with_name else f"Registered OIDs with name containing '{with_name}'", box=box.ROUNDED) table.add_column('OID Name', style='green') table.add_column('OID' if show_oids else 'UUID') if oid_registry: for node in oid_registry.values(): if with_name in node.full_name: if show_oids: table.add_row(*[node.full_name, Text(node.oid, style='number')]) else: table.add_row(*[node.full_name, Text(str(node.uid), style='uuid')]) console.print(table) else: console.print("No OIDs are registered.")
[docs] @app.command() def update_oids(url: str=typer.Argument(ROOT_SPEC, help="URL to OID node specification", metavar='URL')): """Update OID registry from specification(s). """ console.print("Downloading OID specifications ... ", end='') specifications, errors = get_specifications(url) if errors: console.print(RICH_ERROR) console.print_error("Errors occured during download:") for err_url, error in errors: console.print_error(f"URL: {err_url}") console.print_error(f"error: {error}") return console.print(RICH_OK) console.print("Parsing OID specifications ... ", end='') specifications, errors = parse_specifications(specifications) if errors: console.print(RICH_ERROR) console.print_error("Errors detected while parsing OID specifications:") for err_url, error in errors: console.print_error(f"URL: {err_url}") console.print_error(f"error: {error}") return console.print(RICH_OK) # console.print("Updating OID registry ... ", end='') try: oid_registry.update_from_specifications(specifications) except Exception as exc: # pylint: disable=W0703 console.print(RICH_ERROR) console.print_error(exc) console.print(RICH_OK) directory_scheme.site_oids_toml.write_text(oid_registry.as_toml())
[docs] @app.command() def show_oid(oid: str=typer.Argument('', help="OID name or GUID", autocompletion=oid_completer)) -> None: """Show information about OID. """ uid: UUID = None name: str = None node: Node = None try: uid = UUID(oid) except Exception: # pylint: disable=W0703 name = oid if uid is not None: node = oid_registry.get(uid) else: node = oid_registry.find(lambda x: x.full_name.startswith(name)) if node is None: console.print_error('OID not registered!') return table = Table.grid() table.add_column(style='green') table.add_column() table.add_row('OID:', Text(node.oid, style='number')) table.add_row('UID:', _h(Text(str(node.uid)))) table.add_row('Node name:', Text(node.name)) table.add_row('Full name:', Text(node.full_name)) table.add_row('Description:', Text(node.description)) table.add_row('Contact:', Text(node.contact)) table.add_row('E-mail:', _h(Text(node.email))) table.add_row('Site:', _h(Text(node.site))) table.add_row('Node spec.:', _h(Text(str(node.node_spec)))) table.add_row('Node type:', _h(Text(node.node_type.name))) table.add_row('Parent spec.: ', _h(Text(str(node.parent_spec)))) console.print(table)
if directory_scheme.site_oids_toml.is_file(): oid_registry.update_from_toml(directory_scheme.site_oids_toml.read_text())