Source code for eve_panel.eve_client

"""
Eve client
====================================
Client for single or multiple Eve APIs.
"""

from pprint import pprint

import panel as pn
import param
from collections import defaultdict
import httpx

from .eve_model import EveModelBase
from .session import DEFAULT_SESSION_CLASS, EveSessionBase
from .settings import config as settings
from .resource import EveResource


[docs]class EveClient(EveModelBase): name = param.String("EveClient", doc="Human readable name of the client") session = param.ClassSelector(EveSessionBase, constant=True, precedence=-1)
[docs] @classmethod def from_domain_def(cls, domain_def, name="EveApp", session=None, auth_scheme=None, servers={}, sort_by_url=False): if session is None: session = DEFAULT_SESSION_CLASS(known_servers=servers, auth_scheme=auth_scheme) if sort_by_url: domain_def = {v["url"]: v for v in domain_def.values()} sub_domains = defaultdict(dict) params = {} kwargs = {} for url, resource_def in sorted(domain_def.items(), key=lambda x: len(x[0])): sub_url, _, rest = url.partition("/") if rest: sub_domains[sub_url][rest] = resource_def else: resource = EveResource.from_resource_def( resource_def, url, session=session) params[sub_url] = param.ClassSelector(resource.__class__, default=resource, constant=True) kwargs[sub_url] = resource for url, domain_def in sub_domains.items(): if url in params: for sub_url, resource_def in domain_def.items(): resource = EveResource.from_resource_def( resource_def, url, session=session) kwargs[url + "_" + sub_url] = resource params[url + "_" + sub_url] = param.ClassSelector( resource.__class__, default=resource, constant=True) else: sub_domain = EveClient.from_domain_def(domain_def, url, session=session) kwargs[url] = sub_domain params[url] = param.ClassSelector(EveClient, default=sub_domain, constant=True) klass = type(name.title() + "Client", (cls, ), params) instance = klass(name=name, session=session, **kwargs) return instance
[docs] @classmethod def from_server(cls, url, **kwargs): r = httpx.get(url) r.raise_for_status() domain = r.json() return cls.from_domain_def(domain_def=domain, **kwargs)
[docs] @classmethod def from_app(cls, app, **kwargs): domain_def = app.config["DOMAIN"] instance = cls.from_domain_def(domain_def=domain_def, **kwargs) return instance
@property def logged_in(self): return self.session.logged_in
[docs] def login(self, *args, **kwargs): return self.session.login(*args, **kwargs)
[docs] def logout(self): return self.session.logout()
@property def resources(self): return {k:v for k, v in self.param.get_param_values() if isinstance(v, EveResource)} @property def sub_resources(self): return {k:v for k, v in self.param.get_param_values() if isinstance(v, EveClient)} @property def resource_tree(self): return self.collect_resource_tree(False)
[docs] def make_panel(self, show_client=True, tabs_location='above'): tabs = [ (k.upper().replace("_", " "), getattr(self, k).make_panel(show_client=False, tabs_location="above")) for k, v in self.param.objects().items() if isinstance(v, param.ClassSelector) and v.class_ in (EveClient, EveResource) ] tabs.sort(key=lambda x: len(x[0])) if show_client: tabs = [("Session", self.session.panel())] + tabs view = pn.Tabs(*tabs, width=self.max_width-10, max_width=self.max_width, height=self.max_height, sizing_mode=self.sizing_mode, width_policy="max", dynamic=True, tabs_location=tabs_location) return view
[docs] def set_token(self, token): self.session.set_credentials(token=token)
[docs] def set_auth(self, name): self.session.set_auth(name)
[docs] def set_credentials(self, **credentials): self.session.set_credentials(**credentials)
[docs] def set_server_url(self, **kwargs): self.session.set_server_url(**kwargs)
[docs] def get_server_url(self, name): self.session.get_server_url(name)
[docs] def select_server(self, name=None): self.session.select_server(name)
@property def servers(self): return self.session.known_servers
[docs] def collect_resource_tree(self, sort=True): tree = {} for k, v in self.param.get_param_values(): if isinstance(v, EveClient): tree[k] = v.collect_resource_tree() elif isinstance(v, EveResource): tree[k] = v if sort: tree = dict(sorted(tree.items(), key=lambda x: len(x[0]))) return tree
def __dir__(self): return list(self.params()) def __repr__(self): return f"EveClient(name={self.name})"