Skip to content

Commit

Permalink
infer_arguments facade enhancements (#36)
Browse files Browse the repository at this point in the history
* Generate function for defopt

* Generate function for defopt

* Generate function for defopt

* Generate function for defopt

Co-authored-by: Mike <rans@un.org>
  • Loading branch information
mcarans and Mike authored Aug 30, 2022
1 parent 9180120 commit 41c9a88
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 4 deletions.
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
ckanapi==4.7
defopt==6.4.0
email_validator==1.2.1
hdx-python-country==3.3.5
hdx-python-country==3.3.6
makefun==1.14.0
ndg-httpsclient==0.5.1
pyasn1==0.4.8
pyOpenSSL==22.0.0
Expand Down
3 changes: 2 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ install_requires =
ckanapi >= 4.7
defopt >= 6.4.0
email_validator
hdx-python-country>=3.3.5
hdx-python-country>=3.3.6
makefun
ndg-httpsclient
pyasn1
pyOpenSSL
Expand Down
35 changes: 34 additions & 1 deletion src/hdx/facades/infer_arguments.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"""Facade to simplify project setup that calls project main function with kwargs"""
import logging
import sys
from inspect import getdoc, signature
from typing import Any, Callable, Optional

import defopt
from hdx.utilities.easy_logging import setup_logging
from hdx.utilities.useragent import UserAgent
from makefun import with_signature

from hdx.api import __version__
from hdx.api.configuration import Configuration
Expand Down Expand Up @@ -72,12 +75,42 @@ def facade(projectmainfn: Callable[[Any], None], **kwargs: Any):
#
# Setting up configuration
#
func, argv = defopt.bind_known(projectmainfn, cli_options="all")

create_config_sig = signature(_create_configuration)
create_config_params = list(create_config_sig.parameters.values())
main_sig = signature(projectmainfn)
main_params = list(main_sig.parameters.values())
main_params.extend(create_config_params)
main_sig = main_sig.replace(parameters=main_params)

create_config_doc = getdoc(_create_configuration)
parsed_main_doc = defopt._parse_docstring(getdoc(projectmainfn))
main_doc = [f"{parsed_main_doc.first_line}\n\nArgs:"]
for param_name, param_info in parsed_main_doc.params.items():
main_doc.append(
f"\n {param_name} ({param_info.type}): {param_info.text}"
)
args_index = create_config_doc.index("Args:")
args_doc = create_config_doc[args_index + 5 :]
main_doc.append(args_doc)
main_doc = "".join(main_doc)

@with_signature(main_sig, func_name=projectmainfn.__name__)
def gen_func(*args, **kwargs):
"""docstring"""
return args, kwargs

gen_func.__doc__ = main_doc

argv = sys.argv[1:]
for key in kwargs:
name = f"--{key.replace('_', '-')}"
if name not in argv:
argv.append(name)
argv.append(kwargs[key])

defopt.bind(gen_func, argv=argv, cli_options="all")
func, argv = defopt.bind_known(projectmainfn, argv=argv, cli_options="all")
site_url = defopt.run(_create_configuration, argv=argv, cli_options="all")

logger.info("--------------------------------------------------")
Expand Down
13 changes: 12 additions & 1 deletion tests/hdx/facades/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ def my_testfnkw(**kwargs):
raise ValueError("Some failure!")


def my_testfnia(mydata: Optional[str] = None) -> str:
def my_testfnia(mydata: Optional[str] = None, myflag: bool = False) -> str:
"""My test function. It takes in mydata an optional string which defaults to None.
It assigns that to testresult which is an object of type TestResult. It returns
mydata.
Args:
mydata (Optional[str]): Data. Defaults to None.
myflag (bool): My flag. Defaults to False.
Returns:
str: String
"""
testresult.actual_result = mydata
return mydata
12 changes: 12 additions & 0 deletions tests/hdx/facades/test_infer_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,18 @@ def test_facade(
"what",
],
)
with pytest.raises(SystemExit):
facade(my_testfnia)

UserAgent.clear_global()
monkeypatch.setattr(
sys,
"argv",
[
"test",
"-h",
],
)
with pytest.raises(SystemExit):
facade(my_testfnia)
UserAgent.clear_global()

0 comments on commit 41c9a88

Please sign in to comment.