Source code for dashboard.widget_context
from dashboard.sonos import Sonos
import concurrent.futures
import asyncio
import uvhttp.http
from uvhue.uvhue import Hue
[docs]class WidgetContext:
"""
Context that is passed as an argument to widgets when they are called.
The context contains methods useful for widgets.
"""
def __init__(self, resolver=None, settings=None):
self.__sonos = None
self.__client = None
self.__hue = None
self.resolver = resolver
self.settings = settings
self.party_mode = False
self.executor = concurrent.futures.ProcessPoolExecutor()
[docs] async def run(self, func, *args):
"""
Run a function in an external process if it is CPU intensive.
"""
return await asyncio.get_event_loop().run_in_executor(self.executor, func, *args)
@property
def client(self):
"""
A :class:`uvhttp.http.Session` that can be used for
making HTTP requests::
async def ip_widget(wc):
response = await wc.client.get(b'http://httpbin.org/ip')
return { "ip": response.json()["origin"] }
"""
if not self.__client:
self.__client = uvhttp.http.Session(10, asyncio.get_event_loop(), resolver=self.resolver)
return self.__client
@client.setter
def client(self, client):
self.__client = client
@property
def sonos(self):
"""
The :class:`dashboard.sonos.Sonos` client that can be used by widgets.
"""
if not self.__sonos:
self.__sonos = Sonos(self.client)
return self.__sonos
@sonos.setter
def sonos(self, sonos):
self.__sonos = sonos
@property
def hue(self):
"""
The :class:`uvhue.uvhue.Hue` client that can be used by widgets.
"""
if not self.__hue:
hue_api = self.settings['hue_address'].encode()
self.__hue = Hue(asyncio.get_event_loop(), hue_api, resolver=self.resolver)
self.__hue.hue_id = self.settings['hue_token']
return self.__hue
@hue.setter
def hue(self, hue):
self.__hue = hue
def close(self):
self.executor.shutdown()