we have to access to option without restriction

This commit is contained in:
Emmanuel Garette 2019-07-06 08:36:13 +02:00
parent d3eef77c03
commit e73f3d1e47
3 changed files with 252 additions and 235 deletions

View file

@ -4,6 +4,7 @@ from os import listdir
from os.path import dirname, abspath, join, normpath, splitext, isfile
import sys
import warnings
import pytest
from tiramisu import OptionDescription, Config
from tiramisu.error import ValueWarning
@ -123,7 +124,31 @@ def add_property(expected, prop, prop_value):
return ordered_form
def test_jsons():
LISTDATA = list_data()
LISTDATA_MOD = []
idx = 0
while True:
idx += 1
list_files = list_data('.mod{}'.format(idx))
if not list_files:
break
LISTDATA_MOD.extend(list_files)
@pytest.fixture(params=LISTDATA)
def filename(request):
return request.param
@pytest.fixture(params=LISTDATA_MOD)
def filename_mod(request):
return request.param
def test_jsons(filename):
debug = False
# debug = True
datadir = datapath()
@ -137,252 +162,242 @@ def test_jsons():
for remote in ['minimum', 'none', 'all']:
if debug:
print(' ==> remotable', remote)
filenames = list_data()
for filename in filenames:
modulepath = splitext(filename)[0]
if debug:
print(" {} (remote: {}, clearable: {})".format(filename, remote, clearable))
values = load_config(filename,
remote=remote,
clearable=clearable)
#
if not isfile(join(datadir, modulepath + '.json')) and \
clearable == 'minimum' and \
remote == 'minimum':
with open(join(datadir, modulepath + '.json'), 'w') as fh:
dump(values, fh, indent=2)
with open(join(datadir, modulepath + '.json'), 'r') as fh:
expected = loads(fh.read())
if clearable == 'none':
expected['form'] = del_property(expected, 'clearable')
if remote == 'all':
if 'tiramisu' in expected:
del expected['tiramisu']
expected['form'] = del_property(expected, 'pattern')
if clearable == 'all':
expected['form'] = add_property(expected, 'clearable', True)
if remote == 'all':
expected['form'] = add_property(expected, 'remote', True)
new_expected = {}
for key, form in expected['form'].items():
if key != 'null' and form.get('remote', False):
if 'dependencies' in form:
del form['dependencies']
if 'copy' in form:
del form['copy']
if 'not_equal' in form:
del form['not_equal']
new_expected[key] = form
expected['form'] = new_expected
modulepath = splitext(filename)[0]
if debug:
print(" {} (remote: {}, clearable: {})".format(filename, remote, clearable))
values = load_config(filename,
remote=remote,
clearable=clearable)
#
if not isfile(join(datadir, modulepath + '.json')) and \
clearable == 'minimum' and \
remote == 'minimum':
with open(join(datadir, modulepath + '.json'), 'w') as fh:
dump(values, fh, indent=2)
with open(join(datadir, modulepath + '.json'), 'r') as fh:
expected = loads(fh.read())
if clearable == 'none':
expected['form'] = del_property(expected, 'clearable')
if remote == 'all':
if 'tiramisu' in expected:
del expected['tiramisu']
expected['form'] = del_property(expected, 'pattern')
if clearable == 'all':
expected['form'] = add_property(expected, 'clearable', True)
if remote == 'all':
expected['form'] = add_property(expected, 'remote', True)
new_expected = {}
for key, form in expected['form'].items():
if key != 'null' and form.get('remote', False):
if 'dependencies' in form:
del form['dependencies']
if 'copy' in form:
del form['copy']
if 'not_equal' in form:
del form['not_equal']
new_expected[key] = form
expected['form'] = new_expected
# properties are unordered
for model in expected['model']:
if 'properties' in model:
model['properties'] = set(model['properties'])
for model in values['model']:
if 'properties' in model:
model['properties'] = set(model['properties'])
del_value_property(expected['schema'], expected['form'])
if debug:
from pprint import pprint
pprint(values)
print('----------------')
pprint(expected)
assert values == expected, "error in file {}".format(filename)
# properties are unordered
for model in expected['model']:
if 'properties' in model:
model['properties'] = set(model['properties'])
for model in values['model']:
if 'properties' in model:
model['properties'] = set(model['properties'])
del_value_property(expected['schema'], expected['form'])
if debug:
from pprint import pprint
pprint(values)
print('----------------')
pprint(expected)
assert values == expected, "error in file {}".format(filename)
def test_jsons_subconfig():
def test_jsons_subconfig(filename):
debug = False
# debug = True
datadir = datapath()
if debug:
print()
filenames = list_data()
for filename in filenames:
modulepath = splitext(filename)[0]
if debug:
print(" ", filename)
values = load_config(filename, add_extra_od=True, root=modulepath)
#
with open(join(datadir, modulepath + '.json'), 'r') as fh:
expected = loads(fh.read())
# properties are unordered
for model in expected['model'].values():
if 'properties' in model:
model['properties'] = set(model['properties'])
for model in values['model'].values():
if 'properties' in model:
model['properties'] = set(model['properties'])
# add root
modulepath = splitext(filename)[0]
if debug:
print(" ", filename)
values = load_config(filename, add_extra_od=True, root=modulepath)
#
with open(join(datadir, modulepath + '.json'), 'r') as fh:
expected = loads(fh.read())
# properties are unordered
for model in expected['model'].values():
if 'properties' in model:
model['properties'] = set(model['properties'])
for model in values['model'].values():
if 'properties' in model:
model['properties'] = set(model['properties'])
# add root
def change_key(schema):
new_schema = {}
for key_schema, val_schema in schema.items():
key = modulepath + '.' + key_schema
# val_schema['name'] = key
if 'opt_path' in val_schema:
val_schema['opt_path'] = modulepath + '.' + val_schema['opt_path']
if 'properties' in val_schema:
val_schema['properties'] = change_key(val_schema['properties'])
new_schema[key] = val_schema
return new_schema
def change_key(schema):
new_schema = {}
for key_schema, val_schema in schema.items():
key = modulepath + '.' + key_schema
# val_schema['name'] = key
if 'opt_path' in val_schema:
val_schema['opt_path'] = modulepath + '.' + val_schema['opt_path']
if 'properties' in val_schema:
val_schema['properties'] = change_key(val_schema['properties'])
new_schema[key] = val_schema
return new_schema
expected['schema'] = change_key(expected['schema'])
new_form_all = {}
for key, form in expected['form'].items():
if key != 'null':
key = modulepath + '.' + key
new_form_all[key] = form
if 'copy' in form:
for idx, noteq in enumerate(form['copy']):
form['copy'][idx] = modulepath + '.' + noteq
if 'not_equal' in form:
new_form = []
for idx, not_equal in enumerate(form['not_equal']):
for noteq in not_equal['options']:
new_form.append(modulepath + '.' + noteq)
form['not_equal'][idx]['options'] = new_form
if 'dependencies' in form:
for dependency in form['dependencies'].values():
for val1 in dependency.values():
if isinstance(val1, list):
for idx, lst in enumerate(val1):
val1[idx] = modulepath + '.' + lst
else:
for val2 in val1.values():
if isinstance(val2, list):
for idx, lst in enumerate(val2):
val2[idx] = modulepath + '.' + lst
expected['schema'] = change_key(expected['schema'])
new_form_all = {}
for key, form in expected['form'].items():
if key != 'null':
key = modulepath + '.' + key
new_form_all[key] = form
if 'copy' in form:
for idx, noteq in enumerate(form['copy']):
form['copy'][idx] = modulepath + '.' + noteq
if 'not_equal' in form:
new_form = []
for idx, not_equal in enumerate(form['not_equal']):
for noteq in not_equal['options']:
new_form.append(modulepath + '.' + noteq)
form['not_equal'][idx]['options'] = new_form
if 'dependencies' in form:
for dependency in form['dependencies'].values():
for val1 in dependency.values():
if isinstance(val1, list):
for idx, lst in enumerate(val1):
val1[idx] = modulepath + '.' + lst
else:
for val2 in val1.values():
if isinstance(val2, list):
for idx, lst in enumerate(val2):
val2[idx] = modulepath + '.' + lst
expected['form'] = new_form_all
new_model = {}
for key, model in expected['model'].items():
new_model[modulepath + '.' + key] = model
expected['model'] = new_model
if debug:
from pprint import pprint
pprint(values)
print('----------------')
pprint(expected)
assert values == expected, "error in file {}".format(filename)
expected['form'] = new_form_all
new_model = {}
for key, model in expected['model'].items():
new_model[modulepath + '.' + key] = model
expected['model'] = new_model
if debug:
from pprint import pprint
pprint(values)
print('----------------')
pprint(expected)
assert values == expected, "error in file {}".format(filename)
def test_updates():
def test_updates(filename_mod):
debug = False
# debug = True
datadir = datapath()
idx = 0
while True:
idx += 1
list_files = list_data('.mod{}'.format(idx))
if not list_files:
break
for filename in list_files:
if debug:
print("test/data/" + filename)
for issub in [False, True]:
modulepath = splitext(filename)[0]
mod = __import__(modulepath)
descr = mod.get_description()
if debug:
print("test/data/" + filename_mod)
for issub in [False, True]:
idx = int(filename_mod[-1])
modulepath = splitext(filename_mod)[0]
mod = __import__(modulepath)
descr = mod.get_description()
if issub:
descr = OptionDescription('root', '', [descr])
root = modulepath
else:
root = None
# dict before modification
if not isfile(join(datadir, modulepath + '.dict')):
dico_ori = None
else:
with open(join(datadir, modulepath + '.dict'), 'r') as fh:
dico_ori = loads(fh.read())
if issub:
descr = OptionDescription('root', '', [descr])
root = modulepath
else:
root = None
# dict before modification
if not isfile(join(datadir, modulepath + '.dict')):
dico_ori = None
else:
with open(join(datadir, modulepath + '.dict'), 'r') as fh:
dico_ori = loads(fh.read())
if issub:
new_dico_ori = {}
for key, value in dico_ori.items():
key = modulepath + '.' + key
new_dico_ori[key] = value
dico_ori = new_dico_ori
# modify config
with open(join(datadir, modulepath + '.mod{}'.format(idx)), 'r') as fh:
body = loads(fh.read())['body']
if issub:
for value in body['updates']:
value['name'] = modulepath + '.' + value['name']
# returns of set_updates
if not isfile(join(datadir, modulepath + '.updates{}'.format(idx))):
values = None
else:
with open(join(datadir, modulepath + '.updates{}'.format(idx)), 'r') as fh:
values = loads(fh.read())
if issub:
for lidx, key in enumerate(values['updates']):
values['updates'][lidx] = modulepath + '.' + key
if 'model' in values:
new_model = {}
for key, value in values['model'].items():
new_model[modulepath + '.' + key] = value
values['model'] = new_model
# dict after modification
if not isfile(join(datadir, modulepath + '.dict{}'.format(idx))):
dico_mod = None
else:
with open(join(datadir, modulepath + '.dict{}'.format(idx)), 'r') as fh:
dico_mod = loads(fh.read())
if issub:
new_dico = {}
for key, value in dico_mod.items():
key = modulepath + '.' + key
new_dico[key] = value
dico_mod = new_dico
if root is None:
root_path = ''
else:
root_path = '{}.'.format(root)
for clearable in ['none', 'minimum', 'all']:
for remote in ['none', 'minimum', 'all']:
if debug:
print(" (remote: {}, clearable: {}, issub {}, root {}, root_path {})".format(remote, clearable, issub, root, root_path))
for with_model in [False, True]:
config = Config(descr)
config.property.add('demoting_error_warning')
if 'get_values' in dir(mod):
mod.get_values(config, issub)
if isfile(join(datadir, modulepath + '.mod')):
with open(join(datadir, modulepath + '.mod'), 'r') as fh:
eval(fh.read())
if dico_ori is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.dict'), 'w') as fh:
dump(config.value.dict(), fh, indent=2)
else:
assert config.value.dict() == dico_ori, "clearable {}, remote: {}, filename: {}".format(clearable, remote, filename)
if root is None:
suboption = config.option
else:
suboption = config.option(root)
if with_model:
bodym = body.copy()
bodym['model'] = loads(dumps(suboption.dict(remotable=remote, clearable=clearable)))['model']
else:
suboption.dict(remotable=remote, clearable=clearable)
bodym = body
if with_model:
cal_values = suboption.updates(bodym)
if values is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.updates{}'.format(idx)), 'w') as fh:
dump(cal_values, fh, indent=2)
else:
if debug:
from pprint import pprint
pprint(cal_values)
print('------------')
pprint(values)
assert cal_values == values
else:
assert suboption.updates(bodym) is None
if dico_mod is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.dict{}'.format(idx)), 'w') as fh:
dump(config.value.dict(), fh, indent=2)
else:
assert config.value.dict() == dico_mod
new_dico_ori = {}
for key, value in dico_ori.items():
key = modulepath + '.' + key
new_dico_ori[key] = value
dico_ori = new_dico_ori
# modify config
with open(join(datadir, modulepath + '.mod{}'.format(idx)), 'r') as fh:
body = loads(fh.read())['body']
if issub:
for value in body['updates']:
value['name'] = modulepath + '.' + value['name']
# returns of set_updates
if not isfile(join(datadir, modulepath + '.updates{}'.format(idx))):
values = None
else:
with open(join(datadir, modulepath + '.updates{}'.format(idx)), 'r') as fh:
values = loads(fh.read())
if issub:
for lidx, key in enumerate(values['updates']):
values['updates'][lidx] = modulepath + '.' + key
if 'model' in values:
new_model = {}
for key, value in values['model'].items():
new_model[modulepath + '.' + key] = value
values['model'] = new_model
# dict after modification
if not isfile(join(datadir, modulepath + '.dict{}'.format(idx))):
dico_mod = None
else:
with open(join(datadir, modulepath + '.dict{}'.format(idx)), 'r') as fh:
dico_mod = loads(fh.read())
if issub:
new_dico = {}
for key, value in dico_mod.items():
key = modulepath + '.' + key
new_dico[key] = value
dico_mod = new_dico
if root is None:
root_path = ''
else:
root_path = '{}.'.format(root)
for clearable in ['none', 'minimum', 'all']:
for remote in ['none', 'minimum', 'all']:
if debug:
print(" (remote: {}, clearable: {}, issub {}, root {}, root_path {})".format(remote, clearable, issub, root, root_path))
for with_model in [False, True]:
config = Config(descr)
config.property.add('demoting_error_warning')
if 'get_values' in dir(mod):
mod.get_values(config, issub)
if isfile(join(datadir, modulepath + '.mod')):
with open(join(datadir, modulepath + '.mod'), 'r') as fh:
eval(fh.read())
if dico_ori is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.dict'), 'w') as fh:
dump(config.value.dict(), fh, indent=2)
else:
assert config.value.dict() == dico_ori, "clearable {}, remote: {}, filename: {}".format(clearable, remote, filename_mod)
if root is None:
suboption = config.option
else:
suboption = config.option(root)
if with_model:
bodym = body.copy()
bodym['model'] = loads(dumps(suboption.dict(remotable=remote, clearable=clearable)))['model']
else:
suboption.dict(remotable=remote, clearable=clearable)
bodym = body
if with_model:
cal_values = suboption.updates(bodym)
if values is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.updates{}'.format(idx)), 'w') as fh:
dump(cal_values, fh, indent=2)
else:
if debug:
from pprint import pprint
pprint(cal_values)
print('------------')
pprint(values)
assert cal_values == values
else:
assert suboption.updates(bodym) is None
if dico_mod is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.dict{}'.format(idx)), 'w') as fh:
dump(config.value.dict(), fh, indent=2)
else:
assert config.value.dict() == dico_mod

View file

@ -144,6 +144,7 @@ class _TiramisuOptionOptionDescription(CommonTiramisuOption):
"""Manage option"""
_allow_optiondescription = True
_follower_need_index = False
_validate_properties = False
def __init__(self,
name: str,
@ -652,6 +653,7 @@ def _registers(_registers: Dict[str, type],
class _TiramisuOption(CommonTiramisu):
"""Manage selected option"""
_validate_properties = False
_registers = {}
def __init__(self,
name: Optional[str],

View file

@ -470,8 +470,8 @@ class TiramisuDict:
self.add_help(schema[path],
childapi)
except Exception as err:
import traceback
traceback.print_exc()
# import traceback
# traceback.print_exc()
if not init:
raise err
error = err