diff --git a/halfapi/cli/domain.py b/halfapi/cli/domain.py index 32b88b4..46c2844 100644 --- a/halfapi/cli/domain.py +++ b/halfapi/cli/domain.py @@ -8,6 +8,8 @@ import sys import importlib import subprocess +import json + import click import orjson @@ -120,9 +122,10 @@ def list_api_routes(): @click.option('--create',default=False, is_flag=True) @click.option('--update',default=False, is_flag=True) @click.option('--delete',default=False, is_flag=True) +@click.argument('config_file', type=click.File(mode='rb'), required=False) @click.argument('domain',default=None, required=False) @cli.command() -def domain(domain, delete, update, create, read): #, domains, read, create, update, delete): +def domain(domain, config_file, delete, update, create, read): #, domains, read, create, update, delete): """ The "halfapi domain" command @@ -147,17 +150,14 @@ def domain(domain, delete, update, create, read): #, domains, read, create, upd from ..conf import CONFIG from ..halfapi import HalfAPI - try: - config_domain = CONFIG.pop('domain').get(domain, {}) - except KeyError: - config_domain = {} + if config_file: + CONFIG = json.loads(''.join( + [ line.decode() for line in config_file.readlines() ] + )) halfapi = HalfAPI(CONFIG) - - half_domain = halfapi.add_domain(domain, config=config_domain) - click.echo(orjson.dumps( - half_domain.schema(), + halfapi.domains[domain].schema(), option=orjson.OPT_NON_STR_KEYS, default=ORJSONResponse.default_cast) ) diff --git a/halfapi/halfapi.py b/halfapi/halfapi.py index 906ed0b..74c627c 100644 --- a/halfapi/halfapi.py +++ b/halfapi/halfapi.py @@ -122,12 +122,12 @@ class HalfAPI(Starlette): domain_key = domain.get('name', key) - self.add_domain( - domain_key, - domain.get('module'), - domain.get('router'), - domain.get('acl'), - path) + add_domain_args = { + **domain, + 'path': path + } + + self.add_domain(**add_domain_args) schemas.append(self.__domains[domain_key].schema()) @@ -246,28 +246,26 @@ class HalfAPI(Starlette): def domains(self): return self.__domains - def add_domain(self, name, module=None, router=None, acl=None, path='/', config=None): + def add_domain(self, **kwargs): - # logger.debug('HalfApi.add_domain %s %s %s %s %s', - # name, - # module, - # router, - # acl, - # path, - # config) + if not kwargs.get('enabled'): + raise Exception(f'Domain not enabled ({kwargs})') - if config: - self.config['domain'][name] = config + name = kwargs['name'] - if not module: + self.config['domain'][name] = kwargs.get('config', {}) + + if not kwargs.get('module'): module = name + else: + module = kwargs.get('module') try: self.__domains[name] = HalfDomain( name, module=importlib.import_module(module), - router=router, - acl=acl, + router=kwargs.get('router'), + acl=kwargs.get('acl'), app=self ) @@ -279,6 +277,6 @@ class HalfAPI(Starlette): )) raise exc - self.mount(path, self.__domains[name]) + self.mount(kwargs.get('path', name), self.__domains[name]) return self.__domains[name] diff --git a/halfapi/testing/test_domain.py b/halfapi/testing/test_domain.py index 33fc3ff..d2c237a 100644 --- a/halfapi/testing/test_domain.py +++ b/halfapi/testing/test_domain.py @@ -11,6 +11,7 @@ from ..cli.cli import cli from ..halfapi import HalfAPI from ..half_domain import HalfDomain from pprint import pprint +import tempfile class TestDomain(TestCase): @property @@ -53,6 +54,7 @@ class TestDomain(TestCase): 'name': self.DOMAIN, 'router': self.ROUTERS, 'acl': self.ACL, + 'module': self.MODULE, 'prefix': False, 'enabled': True, 'config': { @@ -60,6 +62,10 @@ class TestDomain(TestCase): } } + _, self.config_file = tempfile.mkstemp() + with open(self.config_file, 'w') as fh: + fh.write(json.dumps(self.halfapi_conf)) + self.halfapi = HalfAPI(self.halfapi_conf) self.client = TestClient(self.halfapi.application) @@ -77,7 +83,7 @@ class TestDomain(TestCase): try: result = self.runner.invoke(cli, '--version') self.assertEqual(result.exit_code, 0) - result = self.runner.invoke(cli, ['domain', self.DOMAIN]) + result = self.runner.invoke(cli, ['domain', self.DOMAIN, self.config_file]) self.assertEqual(result.exit_code, 0) result_d = json.loads(result.stdout) result = self.runner.invoke(cli, ['run', '--help'])