diff --git a/ceo/__main__.py b/ceo/__main__.py index d1df4fc..fbc4473 100644 --- a/ceo/__main__.py +++ b/ceo/__main__.py @@ -24,12 +24,10 @@ def register_services(): else: config_file = os.environ.get('CEO_CONFIG', '/etc/csc/ceo.ini') cfg = Config(config_file) - component.provideUtility(cfg, IConfig) baseComponent.registerUtility(cfg, IConfig) # HTTPService http_client = HTTPClient() - component.provideUtility(http_client, IHTTPClient) baseComponent.registerUtility(http_client, IHTTPClient) diff --git a/ceo/cli/positions.py b/ceo/cli/positions.py index 024c826..733e8c0 100644 --- a/ceo/cli/positions.py +++ b/ceo/cli/positions.py @@ -1,19 +1,15 @@ import click - from zope import component -from zope.interface.interfaces import IRegistered, IUtilityRegistration -import zope.component.event # noqa: F401 +from ..utils import http_get, http_post +from .utils import handle_sync_response, handle_stream_response, print_colon_kv from ceo_common.interfaces import IConfig from ceod.transactions.members import UpdateMemberPositionsTransaction -from .utils import handle_sync_response, handle_stream_response, print_colon_kv -from ..utils import http_get, http_post - @click.group(short_help='List or change exec positions') def positions(): - pass + update_commands() @positions.command(short_help='Get current positions') @@ -25,24 +21,21 @@ def get(): @positions.command(short_help='Update positions') def set(**kwargs): + body = {k.replace('_', '-'): v for k, v in kwargs.items()} + print_body = {k: v or '' for k, v in body.items()} click.echo('The positions will be updated:') - print_colon_kv(kwargs.items()) + print_colon_kv(print_body.items()) click.confirm('Do you want to continue?', abort=True) - resp = http_post('/api/positions', json={k.replace('_', '-'): v for k, v in kwargs.items()}) + resp = http_post('/api/positions', json=body) handle_stream_response(resp, UpdateMemberPositionsTransaction.operations) -# Provides dynamic parameter for update command using config file -@component.provideHandler -@component.adapter(IRegistered) -def _handler(event): +# Provides dynamic parameters for `set' command using config file +def update_commands(): global set - if not (IUtilityRegistration.providedBy(event.object) and IConfig.providedBy(event.object.component)): - return - - cfg = event.object.component + cfg = component.getUtility(IConfig) avail = cfg.get('positions_available') required = cfg.get('positions_required') diff --git a/ceo/utils.py b/ceo/utils.py index b23604f..28e4a13 100644 --- a/ceo/utils.py +++ b/ceo/utils.py @@ -69,6 +69,8 @@ def space_colon_kv(pairs: List[Tuple[str, str]]) -> List[str]: key1000: val3 val4 """ + if not pairs: + return [] lines = [] maxlen = max(len(key) for key, val in pairs) for key, val in pairs: diff --git a/tests/ceo/cli/test_positions.py b/tests/ceo/cli/test_positions.py index 453685f..c7ae111 100644 --- a/tests/ceo/cli/test_positions.py +++ b/tests/ceo/cli/test_positions.py @@ -23,7 +23,7 @@ def test_positions(cli_setup): assert result.output == ''' The positions will be updated: president: test_0 -vice_president: test_1 +vice-president: test_1 sysadmin: test_2 secretary: test_3 webmaster: test_4