Source code for eve_panel.domain
"""
domain module
====================================
Tools to create a client for an Eve domain.
"""
from collections import defaultdict
import panel as pn
import param
from . import settings
from .eve_model import EveModelBase
from .http_client import DEFAULT_HTTP_CLIENT, EveHttpClient
from .resource import EveResource
[docs]class EveDomain(EveModelBase):
name = param.String("EveDomain", doc="Human readable name of the domain")
_http_client = param.ClassSelector(EveHttpClient, precedence=-1, doc="http client to be used for requests.")
[docs] @classmethod
def from_domain_def(cls,
domain_def,
domain_name="EveApp",
http_client=None,
sort_by_url=False):
if http_client is None:
http_client = DEFAULT_HTTP_CLIENT()
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, http_client=http_client)
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, http_client=http_client)
kwargs[url + "_" + sub_url] = resource
params[url + "_" + sub_url] = param.ClassSelector(
resource.__class__, default=resource, constant=True)
else:
sub_domain = EveDomain.from_domain_def(domain_def,
url,
http_client=http_client)
kwargs[url] = sub_domain
params[url] = param.ClassSelector(EveDomain,
default=sub_domain,
constant=True)
klass = type(domain_name + "_domain", (cls, ), params)
instance = klass(name=domain_name, _http_client=http_client, **kwargs)
return instance
[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 (EveDomain,
EveResource)
]
tabs.sort(key=lambda x: len(x[0]))
if show_client:
tabs = [("Config", self._http_client.panel)] + tabs
view = pn.Tabs(*tabs, dynamic=True, tabs_location=tabs_location)
return view
[docs] def set_token(self, token):
self._http_client.set_token(token)
def __dir__(self):
return list(self.params())