Fall back to parsing the OPTIONS description

to determine the needed fields for constructing an object.
This commit is contained in:
Jeff Bradberry 2020-04-02 15:20:43 -04:00
parent eb10a1873d
commit a5fa34bd3b

View File

@ -1,5 +1,6 @@
import itertools import itertools
import logging import logging
import re
from awxkit.api.resources import resources from awxkit.api.resources import resources
import awxkit.exceptions as exc import awxkit.exceptions as exc
@ -7,6 +8,7 @@ from . import base
from . import page from . import page
from ..mixins import has_create from ..mixins import has_create
descRE = re.compile('^[*] `(\w+)`: [^(]*\((\w+), ([^)]+)\)')
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -54,6 +56,17 @@ class Api(base.Base):
page.register_page(resources.api, Api) page.register_page(resources.api, Api)
def parse_description(desc):
options = {}
for line in desc[desc.index('POST'):].splitlines():
match = descRE.match(line)
if not match:
continue
options[match.group(1)] = {'type': match.group(2),
'required': match.group(3) == 'required'}
return options
class ApiV2(base.Base): class ApiV2(base.Base):
# Common import/export methods # Common import/export methods
@ -77,9 +90,10 @@ class ApiV2(base.Base):
if 'POST' not in options.r.headers.get('Allow', ''): if 'POST' not in options.r.headers.get('Allow', ''):
return self._options.setdefault(url, None) return self._options.setdefault(url, None)
# FIXME: if POST isn't in the actions, this is a view where we if 'POST' in options.json['actions']:
# don't have write permissions. Try to do something anyway. return self._options.setdefault(url, options.json['actions']['POST'])
return self._options.setdefault(url, options.json['actions'].get('POST', {})) else:
return self._options.setdefault(url, parse_description(options.json['description']))
# Export methods # Export methods