import json
import argschema
import pytest
[docs]class MyNestedSchema(argschema.schemas.DefaultSchema):
one = argschema.fields.Int(required=True,description="nested integer")
two = argschema.fields.Boolean(required=True,description="a nested boolean")
[docs]class MySchema(argschema.ArgSchema):
a = argschema.fields.Int(required=True,description="parameter a")
b = argschema.fields.Str(required=False,default="my value",description="optional b string parameter")
nest = argschema.fields.Nested(MyNestedSchema,description="a nested schema")
[docs]class MyParser(argschema.ArgSchemaParser):
default_schema = MySchema
[docs]def test_my_parser():
input_data = {
'a':5,
'nest':{
'one':7,
'two':False
}
}
mod = MyParser(input_data = input_data, args=[])
[docs]class MyNestedSchemaWithDefaults(argschema.schemas.DefaultSchema):
one = argschema.fields.Int(default=1,
description="nested integer")
two = argschema.fields.Boolean(default=True,
description="a nested boolean")
[docs]class MySchema2(argschema.ArgSchema):
a = argschema.fields.Int(required=True,description="parameter a")
b = argschema.fields.Str(required=False,default="my value",description="optional b string parameter")
nest = argschema.fields.Nested(MyNestedSchemaWithDefaults,description="a nested schema")
[docs]def test_my_default_nested_parser():
input_data = {
'a':5
}
mod = argschema.ArgSchemaParser(input_data = input_data,
schema_type=MySchema2,
args=None)
[docs]@pytest.mark.parametrize("default,args,expected", [
(True, ["--nest.two", "False"], False),
(True, ["--nest.two", "0"], False),
(True, ["--nest.two", "'f'"], False),
(False, ["--nest.two", "True"], True),
(False, ["--nest.two", "1"], True)
])
def test_boolean_command_line(default, args, expected):
input_data = {
'a':5,
'nest':{
'one':7,
'two':default
}
}
mod = MyParser(input_data=input_data, args=args)
assert(isinstance(mod.args['nest']['two'], bool))
assert(mod.args['nest']['two'] == expected)
[docs]def test_parser_output(tmpdir_factory):
json_path = tmpdir_factory.mktemp('data').join('test_output.json')
input_data = {
'a':5,
'nest':{
'one':7,
'two':False
}
}
mod = MyParser(input_data=input_data)
mod.output(mod.args, output_path=str(json_path), indent=2)
with open(str(json_path), 'r') as jf:
obt = json.load(jf)
assert(obt['nest']['one'] == mod.args['nest']['one'])
with open(str(json_path), 'r') as jf:
lines = jf.readlines()
assert( len(lines) >= 8 ) # true if indent param worked