Implement basic functionality

This commit is contained in:
Patrick Elmer 2022-07-11 11:50:41 +09:00
parent 8b0aa373a4
commit 51978e18ff
4 changed files with 117 additions and 1 deletions

View File

@ -1,3 +1,16 @@
# magicli
Automatically call functions from args parsed by `docopt`
Automatically call functions from args parsed by `docopt`.
## Install
`pip install git+https://git.beelm.eu/patrick/magicli`
## Getting started
```python
from docopt import docopt
from magicli import magicli
args = magically(docopt(__doc__))
```

56
magicli.py Normal file
View File

@ -0,0 +1,56 @@
"""
# Getting started
```python
from docopt import docopt
from magicli import magicli
args = magically(docopt(__doc__))
```
"""
import inspect
from docopt import docopt
def magicli(args, glbls=None):
"""
Calls all callable functions with all arguments.
"""
# Get the `globals()` dict of the file from where the function is called.
if not glbls:
glbls = inspect.currentframe().f_back.f_globals
cleaned_args = clean_args(args)
args = args_set_in_cli(cleaned_args)
for arg in args:
if arg in glbls:
func = glbls.get(arg)
func_args = inspect.getargspec(func).args
kwargs = {arg:args[arg] for arg in args if arg in func_args}
func(**kwargs)
return cleaned_args
def clean_args(args):
"""
Creates a new dict of variables converted to correct function names.
"""
return {parse_function_name(key): args[key] for key in args}
def parse_function_name(func):
"""
Convert variables to valid python function names.
"""
for char in ['<', '>', '-']:
func = func.strip(char)
return func.replace('-', '_')
def args_set_in_cli(args):
"""
Returns a list of all dictionary entries that are specified in cli.
"""
return {arg:args[arg] for arg in args if args[arg]}

13
setup.py Normal file
View File

@ -0,0 +1,13 @@
from setuptools import setup
setup(
name='magicli',
version='0.1.0',
extras_require = {
'tests': [
'pytest',
'docopt',
]
}
)

34
tests/test_magicli.py Normal file
View File

@ -0,0 +1,34 @@
from magicli import clean_args
from magicli import parse_function_name
from magicli import args_set_in_cli
def test_clean_args():
args = {
"<name-1>": True,
"--name-2": False
}
assert clean_args(args) == {
"name_1": True,
"name_2": False
}
def test_parse_function_name():
assert parse_function_name('<name-1>') == 'name_1'
assert parse_function_name('--name-2') == 'name_2'
def test_args_set_in_cli():
args = {
"a": True,
"b": False,
"c": None,
"d": 1,
"e": "a"
}
assert args_set_in_cli(args) == {
"a": True,
"d": 1,
"e": "a"
}