Prettify output, add __str__ to neostat class.
This commit is contained in:
parent
2430b7d5cd
commit
69819d81b2
|
@ -98,6 +98,19 @@ class NeoStat(SimpleNamespace):
|
||||||
_time = datetime.strptime(self.time, "%H:%M")
|
_time = datetime.strptime(self.time, "%H:%M")
|
||||||
self.time = timedelta(hours=_time.hour, minutes=_time.minute)
|
self.time = timedelta(hours=_time.hour, minutes=_time.minute)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
"""
|
||||||
|
String representation.
|
||||||
|
"""
|
||||||
|
data_elem = []
|
||||||
|
for elem in dir(self):
|
||||||
|
if not callable(getattr(self, elem)) and not elem.startswith('_'):
|
||||||
|
data_elem.append(elem)
|
||||||
|
out = 'HeatMiser NeoStat (%s):\n' % (self.name)
|
||||||
|
for elem in data_elem:
|
||||||
|
out += ' - %s: %s\n' % (elem, getattr(self, elem))
|
||||||
|
return out
|
||||||
|
|
||||||
async def identify(self):
|
async def identify(self):
|
||||||
"""
|
"""
|
||||||
Flashes red LED light
|
Flashes red LED light
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
# SPDX-FileCopyrightText: 2021 Dave O'Connor <daveoc@google.com>
|
# SPDX-FileCopyrightText: 2021 Dave O'Connor <daveoc@google.com>
|
||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import types
|
||||||
import asyncio
|
import asyncio
|
||||||
import argparse
|
import argparse
|
||||||
from inspect import ismethod, signature
|
from inspect import ismethod, signature
|
||||||
|
@ -18,6 +19,10 @@ class NeohubCLIUsageError(Error):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NeohubCLIInternalError(Error):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class NeohubCLI(object):
|
class NeohubCLI(object):
|
||||||
"""A runner for neohub_cli operations."""
|
"""A runner for neohub_cli operations."""
|
||||||
|
|
||||||
|
@ -60,6 +65,47 @@ class NeohubCLI(object):
|
||||||
print(f'Cannot do {self._command} yet')
|
print(f'Cannot do {self._command} yet')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def output(self, raw_result, output_format='json'):
|
||||||
|
"""Produce output in a desired format."""
|
||||||
|
if output_format == 'raw':
|
||||||
|
return raw_result
|
||||||
|
|
||||||
|
# Right now, everything just returns hub data or a single outcome
|
||||||
|
# except get_live_data. Handle special cases.
|
||||||
|
special_case = getattr(self, f'_output_{self._command}', None)
|
||||||
|
if special_case:
|
||||||
|
return special_case(raw_result, output_format)
|
||||||
|
|
||||||
|
if type(raw_result) in (int, str):
|
||||||
|
return f'{raw_result}'
|
||||||
|
|
||||||
|
if type(raw_result) != types.SimpleNamespace:
|
||||||
|
raise NeohubCLIInternalError(
|
||||||
|
'Unexpected type {type(raw_result)} in output()')
|
||||||
|
|
||||||
|
return self._output_simplenamespace(raw_result, output_format)
|
||||||
|
|
||||||
|
def _output_simplenamespace(self, obj, output_format):
|
||||||
|
"""Output a types.Simplenamespace object."""
|
||||||
|
if output_format == 'list':
|
||||||
|
attrs = dict(
|
||||||
|
[(a, getattr(obj, a)) for a in dir(obj)
|
||||||
|
if not a.startswith('_')])
|
||||||
|
return '\n'.join([f'{a}: {attrs[a]}' for a in attrs])
|
||||||
|
else:
|
||||||
|
raise NeohubCLIUsageError(f'Unknown output format {output_format}')
|
||||||
|
|
||||||
|
def _output_get_live_data(self, raw_result, output_format):
|
||||||
|
"""Return special case output for get_live_data."""
|
||||||
|
out = self._output_simplenamespace(raw_result[0], output_format)
|
||||||
|
out += '\n\n'
|
||||||
|
for device_type in raw_result[1]:
|
||||||
|
out += f'{device_type}:\n'
|
||||||
|
devices = raw_result[1][device_type]
|
||||||
|
for d in devices:
|
||||||
|
out += str(d) + '\n'
|
||||||
|
return out
|
||||||
|
|
||||||
def get_help(self, args):
|
def get_help(self, args):
|
||||||
"""Print help on what commands do"""
|
"""Print help on what commands do"""
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
|
@ -91,6 +137,7 @@ async def main():
|
||||||
argp.add_argument('--hub_ip', help='IP address of Neohub', default=None)
|
argp.add_argument('--hub_ip', help='IP address of Neohub', default=None)
|
||||||
argp.add_argument(
|
argp.add_argument(
|
||||||
'--hub_port', help='Port number of Neohub to talk to', default=4242)
|
'--hub_port', help='Port number of Neohub to talk to', default=4242)
|
||||||
|
argp.add_argument('--format', help='Output format', default='list')
|
||||||
argp.add_argument('command', help='Command to issue')
|
argp.add_argument('command', help='Command to issue')
|
||||||
argp.add_argument('arg', help='Arguments to command', nargs='*')
|
argp.add_argument('arg', help='Arguments to command', nargs='*')
|
||||||
args = argp.parse_args()
|
args = argp.parse_args()
|
||||||
|
@ -104,8 +151,7 @@ async def main():
|
||||||
m = nhc.callable()
|
m = nhc.callable()
|
||||||
if m:
|
if m:
|
||||||
result = await m()
|
result = await m()
|
||||||
# TODO(daveoc): Make delightful.
|
print(nhc.output(result, output_format=args.format))
|
||||||
print(result)
|
|
||||||
except Error as e:
|
except Error as e:
|
||||||
print(e)
|
print(e)
|
||||||
argp.print_help()
|
argp.print_help()
|
||||||
|
|
Loading…
Reference in New Issue