diff --git a/test/autopath.py b/test/autopath.py index 11c5057..8820560 100644 --- a/test/autopath.py +++ b/test/autopath.py @@ -7,8 +7,8 @@ checkout) from os.path import dirname, abspath, join, normpath import sys -HERE = dirname(abspath(__file__)) -PATH = normpath(join(HERE, '..', 'tiramisu')) -if PATH not in sys.path: - sys.path.insert(1, PATH) - +def do_autopath(): + HERE = dirname(abspath(__file__)) + PATH = normpath(join(HERE, '..', 'tiramisu')) + if PATH not in sys.path: + sys.path.insert(1, PATH) diff --git a/test/test_cache.py b/test/test_cache.py index 5fe4472..2eb2268 100644 --- a/test/test_cache.py +++ b/test/test_cache.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from tiramisu import setting setting.expires_time = 1 from tiramisu.option import IntOption, OptionDescription @@ -20,9 +22,10 @@ def make_description(): def test_cache_config(): od1 = make_description() - assert od1.impl_already_build_caches() == False + assert od1.impl_already_build_caches() is False c = Config(od1) - assert od1.impl_already_build_caches() == True + assert od1.impl_already_build_caches() is True + c def test_cache(): diff --git a/test/test_choice_option.py b/test/test_choice_option.py index 470f247..9b3d504 100644 --- a/test/test_choice_option.py +++ b/test/test_choice_option.py @@ -1,5 +1,6 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() from tiramisu.setting import owners from tiramisu.option import ChoiceOption, StrOption, OptionDescription diff --git a/test/test_config.py b/test/test_config.py index 8c41305..7e743ba 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -2,8 +2,9 @@ """theses tests are much more to test that config, option description, vs... **it's there** and answers via attribute access""" +from autopath import do_autopath +do_autopath() -import autopath from py.test import raises from tiramisu.config import Config, SubConfig @@ -165,6 +166,7 @@ def test_config_impl_get_path_by_opt(): dummy = config.unwrap_from_path('gc.dummy') boo = config.unwrap_from_path('bool') unknown = IntOption('test', '') + unknown assert config.cfgimpl_get_description().impl_get_path_by_opt(boo) == 'bool' assert config.cfgimpl_get_description().impl_get_path_by_opt(dummy) == 'gc.dummy' raises(AttributeError, "config.cfgimpl_get_description().impl_get_path_by_opt(unknown)") @@ -236,11 +238,13 @@ def test_values_not_setitem(): d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5]) root = OptionDescription('root', '', [d1]) config = Config(root) + config raises(ConfigError, "config.cfgimpl_get_values()[g1] = 2") def test_duplicated_option(): g1 = IntOption('g1', '', 1) + g1 #in same OptionDescription raises(ConflictError, "d1 = OptionDescription('od', '', [g1, g1])") @@ -250,12 +254,14 @@ def test_duplicated_option_diff_od(): d1 = OptionDescription('od1', '', [g1]) #in different OptionDescription d2 = OptionDescription('od2', '', [g1, d1]) + d2 raises(ConflictError, 'Config(d2)') def test_cannot_assign_value_to_option_description(): descr = make_description() cfg = Config(descr) + cfg raises(TypeError, "cfg.gc = 3") diff --git a/test/test_config_api.py b/test/test_config_api.py index 920b7e5..1c4ad06 100644 --- a/test/test_config_api.py +++ b/test/test_config_api.py @@ -1,5 +1,7 @@ "configuration objects global API" -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config @@ -197,6 +199,7 @@ def test_find_multi(): def test_does_not_find_in_config(): descr = make_description() conf = Config(descr) + conf raises(AttributeError, "conf.find(byname='IDontExist')") @@ -266,14 +269,21 @@ def test_impl_getpaths(): def test_invalid_option(): + ChoiceOption('a', '', ('1', '2')) raises(TypeError, "ChoiceOption('a', '', [1, 2])") raises(TypeError, "ChoiceOption('a', '', 1)") raises(ValueError, "ChoiceOption('a', '', (1,), 3)") + FloatOption('a', '') raises(ValueError, "FloatOption('a', '', 'string')") + UnicodeOption('a', '') raises(ValueError, "UnicodeOption('a', '', 1)") + u = UnicodeOption('a', '') + SymLinkOption('a', u) raises(ValueError, "SymLinkOption('a', 'string')") + IPOption('a', '') raises(ValueError, "IPOption('a', '', 1)") raises(ValueError, "IPOption('a', '', 'string')") + PortOption('a', '') raises(ValueError, "PortOption('a', '', 'string')") raises(ValueError, "PortOption('a', '', '11:12:13', allow_range=True)") raises(ValueError, "PortOption('a', '', 11111111111111111111)") @@ -282,9 +292,13 @@ def test_invalid_option(): raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=False, allow_private=True)") raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=True, allow_private=True)") raises(ValueError, "PortOption('a', '', allow_zero=False, allow_wellknown=False, allow_registred=False, allow_private=False)") + NetworkOption('a', '') raises(ValueError, "NetworkOption('a', '', 'string')") + NetmaskOption('a', '') raises(ValueError, "NetmaskOption('a', '', 'string')") + BroadcastOption('a', '') raises(ValueError, "BroadcastOption('a', '', 'string')") + DomainnameOption('a', '') raises(ValueError, "DomainnameOption('a', '', 'string')") raises(ValueError, "DomainnameOption('a', '', type_='string')") raises(ValueError, "DomainnameOption('a', '', allow_ip='string')") diff --git a/test/test_config_big_example.py b/test/test_config_big_example.py deleted file mode 100644 index b6613b1..0000000 --- a/test/test_config_big_example.py +++ /dev/null @@ -1,258 +0,0 @@ -##just a proof of concept with a lot of options and option groups -#import autopath -#from tiramisu.config import * -#from tiramisu.option import * - -#all_modules = ['amon', 'sphynx', 'zephir'] - -#example__optiondescription = OptionDescription("objspace", "Object Space Options", [ -# ChoiceOption("name", "Object Space name", -# ["std", "flow", "thunk", "dump", "taint"], -# "std"), - -# OptionDescription("opcodes", "opcodes to enable in the interpreter", [ -# BoolOption("CALL_LIKELY_BUILTIN", "emit a special bytecode for likely calls to builtin functions", -# default=False, -# requires=[("translation.stackless", False)]), -# BoolOption("CALL_METHOD", "emit a special bytecode for expr.name()", -# default=False), -# ]), - -# BoolOption("nofaking", "disallow faking in the object space", -# default=False, -# requires=[ -# ("objspace.usemodules.posix", True), -# ("objspace.usemodules.time", True), -# ("objspace.usemodules.errno", True)], -# ), - -# OptionDescription("usemodules", "Which Modules should be used", [ -# BoolOption(modname, "use module %s" % (modname, ), -# default=True, -# requires= [('amon', False)], -# ) -# for modname in all_modules]), - -# BoolOption("allworkingmodules", "use as many working modules as possible", -# default=True, -# ), - -# BoolOption("translationmodules", -# "use only those modules that are needed to run translate.py on pypy", -# default=False, -# ), - -# BoolOption("geninterp", "specify whether geninterp should be used", -# default=True), - -# BoolOption("logbytecodes", -# "keep track of bytecode usage", -# default=False), - -# BoolOption("usepycfiles", "Write and read pyc files when importing", -# default=True), - -# BoolOption("lonepycfiles", "Import pyc files with no matching py file", -# default=False, -# requires=[("objspace.usepycfiles", True)]), - -# StrOption("soabi", -# "Tag to differentiate extension modules built for different Python interpreters", -# default=None), - -# BoolOption("honor__builtins__", -# "Honor the __builtins__ key of a module dictionary", -# default=False), - -# BoolOption("disable_call_speedhacks", -# "make sure that all calls go through space.call_args", -# default=False), - -# BoolOption("timing", -# "timing of various parts of the interpreter (simple profiling)", -# default=False), - -# OptionDescription("std", "Standard Object Space Options", [ -# BoolOption("withtproxy", "support transparent proxies", -# default=True), - -# BoolOption("withsmallint", "use tagged integers", -# default=False, -# requires=[("objspace.std.withprebuiltint", False), -# ("translation.taggedpointers", True)]), - -# BoolOption("withprebuiltint", "prebuild commonly used int objects", -# default=False), - -# IntOption("prebuiltintfrom", "lowest integer which is prebuilt", -# default=-5), - -# IntOption("prebuiltintto", "highest integer which is prebuilt", -# default=100), - -# BoolOption("withstrjoin", "use strings optimized for addition", -# default=False), - -# BoolOption("withstrslice", "use strings optimized for slicing", -# default=False), - -# BoolOption("withstrbuf", "use strings optimized for addition (ver 2)", -# default=False), - -# BoolOption("withprebuiltchar", -# "use prebuilt single-character string objects", -# default=False), - -# BoolOption("sharesmallstr", -# "always reuse the prebuilt string objects " -# "(the empty string and potentially single-char strings)", -# default=False), - -# BoolOption("withrope", "use ropes as the string implementation", -# default=False, -# requires=[("objspace.std.withstrslice", False), -# ("objspace.std.withstrjoin", False), -# ("objspace.std.withstrbuf", False)], -# ), - -# BoolOption("withropeunicode", "use ropes for the unicode implementation", -# default=False, -# requires=[("objspace.std.withrope", True)]), - -# BoolOption("withcelldict", -# "use dictionaries that are optimized for being used as module dicts", -# default=False, -# requires=[("objspace.opcodes.CALL_LIKELY_BUILTIN", False), -# ("objspace.honor__builtins__", False)]), - -# BoolOption("withdictmeasurement", -# "create huge files with masses of information " -# "about dictionaries", -# default=False), - -# BoolOption("withmapdict", -# "make instances really small but slow without the JIT", -# default=False, -# requires=[("objspace.std.getattributeshortcut", True), -# ("objspace.std.withtypeversion", True), -# ]), - -# BoolOption("withrangelist", -# "enable special range list implementation that does not " -# "actually create the full list until the resulting " -# "list is mutated", -# default=False), - -# BoolOption("withtypeversion", -# "version type objects when changing them", -# default=False, -# # weakrefs needed, because of get_subclasses() -# requires=[("translation.rweakref", True)]), - -# BoolOption("withmethodcache", -# "try to cache method lookups", -# default=False, -# requires=[("objspace.std.withtypeversion", True), -# ("translation.rweakref", True)]), -# BoolOption("withmethodcachecounter", -# "try to cache methods and provide a counter in __pypy__. " -# "for testing purposes only.", -# default=False, -# requires=[("objspace.std.withmethodcache", True)]), -# IntOption("methodcachesizeexp", -# " 2 ** methodcachesizeexp is the size of the of the method cache ", -# default=11), -# BoolOption("optimized_int_add", -# "special case the addition of two integers in BINARY_ADD", -# default=False), -# BoolOption("optimized_comparison_op", -# "special case the comparison of integers", -# default=False), -# BoolOption("optimized_list_getitem", -# "special case the 'list[integer]' expressions", -# default=False), -# BoolOption("builtinshortcut", -# "a shortcut for operations between built-in types", -# default=False), -# BoolOption("getattributeshortcut", -# "track types that override __getattribute__", -# default=False), -# BoolOption("newshortcut", -# "cache and shortcut calling __new__ from builtin types", -# default=False), - -# BoolOption("logspaceoptypes", -# "a instrumentation option: before exit, print the types seen by " -# "certain simpler bytecodes", -# default=False), -# ChoiceOption("multimethods", "the multimethod implementation to use", -# ["doubledispatch", "mrd"], -# default="mrd"), -# BoolOption("immutable_builtintypes", -# "Forbid the changing of builtin types", default=True), -# ]), -#]) - -## ____________________________________________________________ - -#def get_combined_translation_config(other_optdescr=None, -# existing_config=None, -# overrides=None, -# translating=False): -# if overrides is None: -# overrides = {} -# d = BoolOption("translating", -# "indicates whether we are translating currently", -# default=False) -# if other_optdescr is None: -# children = [] -# newname = "" -# else: -# children = [other_optdescr] -# newname = other_optdescr._name -# descr = OptionDescription("eole", "all options", children) -# config = Config(descr, **overrides) -# if translating: -# config.translating = True -# if existing_config is not None: -# for child in existing_config._cfgimpl_descr._children: -# if child._name == newname: -# continue -# value = getattr(existing_config, child._name) -# config._cfgimpl_values[child._name] = value -# return config - -#def get_example_config(overrides=None, translating=False): -# return get_combined_translation_config( -# example__optiondescription, overrides=overrides, -# translating=translating) - -## ____________________________________________________________ - -#def test_example_option(): -# config = get_example_config() -# result = ['objspace.name', 'objspace.opcodes.CALL_LIKELY_BUILTIN', -# 'objspace.opcodes.CALL_METHOD', 'objspace.nofaking', -# 'objspace.usemodules.amon', 'objspace.usemodules.sphynx', -# 'objspace.usemodules.zephir', 'objspace.allworkingmodules', -# 'objspace.translationmodules', 'objspace.geninterp', -# 'objspace.logbytecodes', 'objspace.usepycfiles', 'objspace.lonepycfiles', -# 'objspace.soabi', 'objspace.honor__builtins__', -# 'objspace.disable_call_speedhacks', 'objspace.timing', -# 'objspace.std.withtproxy', 'objspace.std.withsmallint', -# 'objspace.std.withprebuiltint', 'objspace.std.prebuiltintfrom', -# 'objspace.std.prebuiltintto', 'objspace.std.withstrjoin', -# 'objspace.std.withstrslice', 'objspace.std.withstrbuf', -# 'objspace.std.withprebuiltchar', 'objspace.std.sharesmallstr', -# 'objspace.std.withrope', 'objspace.std.withropeunicode', -# 'objspace.std.withcelldict', 'objspace.std.withdictmeasurement', -# 'objspace.std.withmapdict', 'objspace.std.withrangelist', -# 'objspace.std.withtypeversion', 'objspace.std.withmethodcache', -# 'objspace.std.withmethodcachecounter', 'objspace.std.methodcachesizeexp', -# 'objspace.std.optimized_int_add', 'objspace.std.optimized_comparison_op', -# 'objspace.std.optimized_list_getitem', 'objspace.std.builtinshortcut', -# 'objspace.std.getattributeshortcut', 'objspace.std.newshortcut', -# 'objspace.std.logspaceoptypes', 'objspace.std.multimethods', -# 'objspace.std.immutable_builtintypes'] - -# assert config.getpaths(allpaths=True) == result diff --git a/test/test_config_domain.py b/test/test_config_domain.py index 30b9e00..f3a5b56 100644 --- a/test/test_config_domain.py +++ b/test/test_config_domain.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + import warnings from py.test import raises diff --git a/test/test_config_ip.py b/test/test_config_ip.py index 581cbd2..b4359f4 100644 --- a/test/test_config_ip.py +++ b/test/test_config_ip.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config from tiramisu.option import IPOption, NetworkOption, NetmaskOption, \ @@ -27,6 +29,7 @@ def test_ip(): c = Config(od) raises(ValueError, "c.a = '192.000.023.01'") + def test_ip_default(): a = IPOption('a', '', '88.88.88.88') od = OptionDescription('od', '', [a]) diff --git a/test/test_dereference.py b/test/test_dereference.py index e23c065..f8776b5 100644 --- a/test/test_dereference.py +++ b/test/test_dereference.py @@ -1,6 +1,6 @@ # coding: utf-8 -import autopath -#from py.test import raises +from autopath import do_autopath +do_autopath() from tiramisu.config import Config, GroupConfig, MetaConfig from tiramisu.option import BoolOption, IntOption, StrOption, OptionDescription, submulti @@ -9,6 +9,7 @@ import weakref IS_DEREFABLE = True + def test_deref_storage(): b = BoolOption('b', '') o = OptionDescription('od', '', [b]) diff --git a/test/test_dyn_optiondescription.py b/test/test_dyn_optiondescription.py index 5b830e5..89da108 100644 --- a/test/test_dyn_optiondescription.py +++ b/test/test_dyn_optiondescription.py @@ -1,5 +1,6 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() from tiramisu.setting import groups, owners from tiramisu.option import BoolOption, StrOption, ChoiceOption, IPOption, \ @@ -85,6 +86,7 @@ def test_unknown_dyndescription(): od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = Config(od2) + cfg raises(AttributeError, "cfg.od.dodval3") raises(AttributeError, "cfg.od.dodval1.novalue") @@ -711,6 +713,7 @@ def test_consistency_external_dyndescription(): st2 = StrOption('st2', '') dod = DynOptionDescription('dod', '', [st1, st2], callback=return_list) od = OptionDescription('od', '', [dod, st]) + od raises(ConfigError, "st.impl_add_consistency('not_equal', st2)") @@ -722,6 +725,7 @@ def test_consistency_notsame_dyndescription(): tst2 = StrOption('tst2', '') tdod = DynOptionDescription('tdod', '', [tst1, tst2], callback=return_list) od = OptionDescription('od', '', [dod, tdod]) + od raises(ConfigError, "st1.impl_add_consistency('not_equal', tst1)") @@ -1279,30 +1283,35 @@ def test_invalid_conflict_dyndescription(): st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], callback=return_list) dodinvalid = StrOption('dodinvalid', '') + dod, dodinvalid raises(ConflictError, "OptionDescription('od', '', [dod, dodinvalid])") def test_invalid_subod_dyndescription(): st2 = StrOption('st2', '') od1 = OptionDescription('od1', '', [st2]) + od1 raises(ConfigError, "DynOptionDescription('dod', '', [od1], callback=return_list)") def test_invalid_subdynod_dyndescription(): st2 = StrOption('st2', '') od1 = DynOptionDescription('od1', '', [st2], callback=return_list) + od1 raises(ConfigError, "DynOptionDescription('dod', '', [od1], callback=return_list)") def test_invalid_symlink_dyndescription(): st = StrOption('st', '') st2 = SymLinkOption('st2', st) + st2 raises(ConfigError, "DynOptionDescription('dod', '', [st, st2], callback=return_list)") def test_nocallback_dyndescription(): st = StrOption('st', '') st2 = StrOption('st2', '') + st, st2 raises(ConfigError, "DynOptionDescription('dod', '', [st, st2])") @@ -1311,6 +1320,7 @@ def test_invalid_samevalue_dyndescription(): dod = DynOptionDescription('dod', '', [st], callback=return_same_list) od = OptionDescription('od', '', [dod]) cfg = Config(od) + cfg raises(ConfigError, "print cfg") @@ -1319,4 +1329,5 @@ def test_invalid_name_dyndescription(): dod = DynOptionDescription('dod', '', [st], callback=return_wrong_list) od = OptionDescription('od', '', [dod]) cfg = Config(od) + cfg raises(ValueError, "print cfg") diff --git a/test/test_freeze.py b/test/test_freeze.py index 9b0f71e..3d9a923 100644 --- a/test/test_freeze.py +++ b/test/test_freeze.py @@ -1,6 +1,7 @@ # coding: utf-8 "frozen and hidden values" -import autopath +from autopath import do_autopath +do_autopath() from tiramisu.setting import owners from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \ diff --git a/test/test_mandatory.py b/test/test_mandatory.py index 374e2aa..69ea2ad 100644 --- a/test/test_mandatory.py +++ b/test/test_mandatory.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + from time import sleep #from py.test import raises diff --git a/test/test_metaconfig.py b/test/test_metaconfig.py index f472d17..b395fcb 100644 --- a/test/test_metaconfig.py +++ b/test/test_metaconfig.py @@ -1,4 +1,5 @@ -import autopath +from autopath import do_autopath +do_autopath() from py.test import raises @@ -177,6 +178,7 @@ def test_not_meta(): conf2 = Config(od2, name='conf2') conf3 = Config(od2) conf4 = Config(od2, name='conf2') + conf3, conf4 raises(ValueError, "GroupConfig(conf1)") #same name raises(ConflictError, "GroupConfig([conf2, conf4])") @@ -215,6 +217,7 @@ def test_meta_unconsistent(): conf2 = Config(od2, name='conf2') conf3 = Config(od2, name='conf3') conf4 = Config(od1, name='conf4') + conf3, conf4 meta = MetaConfig([conf1, conf2]) meta.cfgimpl_get_settings().setowner(owners.meta) raises(TypeError, 'MetaConfig("string")') diff --git a/test/test_multi.py b/test/test_multi.py index 42fd8e1..6d06011 100644 --- a/test/test_multi.py +++ b/test/test_multi.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from tiramisu.value import Multi from tiramisu.option import IntOption, OptionDescription from tiramisu.config import Config @@ -13,7 +15,7 @@ def test_multi(): i = IntOption('int', '', multi=True) o = OptionDescription('od', '', [i]) c = Config(o) - multi = Multi([1,2,3], weakref.ref(c), i, 'int') + multi = Multi([1, 2, 3], weakref.ref(c), i, 'int') raises(ValueError, "Multi([1,2,3], c, i, 'int')") raises(ValueError, "Multi(multi, weakref.ref(c), i, 'int')") assert c is multi._getcontext() diff --git a/test/test_option.py b/test/test_option.py index 64985ea..90113e0 100644 --- a/test/test_option.py +++ b/test/test_option.py @@ -1,7 +1,9 @@ """these tests are here to create some :class:`tiramisu.option.Option`'s and to compare them """ -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.option import IntOption, OptionDescription diff --git a/test/test_option_calculation.py b/test/test_option_calculation.py index 6b12387..694e524 100644 --- a/test/test_option_calculation.py +++ b/test/test_option_calculation.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config diff --git a/test/test_option_consistency.py b/test/test_option_consistency.py index 9be2507..c6a0f09 100644 --- a/test/test_option_consistency.py +++ b/test/test_option_consistency.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.setting import owners, groups diff --git a/test/test_option_default.py b/test/test_option_default.py index 6aaf631..dfe2b97 100644 --- a/test/test_option_default.py +++ b/test/test_option_default.py @@ -1,5 +1,7 @@ "test all types of option default values for options, add new option in a descr" -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config diff --git a/test/test_option_owner.py b/test/test_option_owner.py index 4b8fdb0..6065051 100644 --- a/test/test_option_owner.py +++ b/test/test_option_owner.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.setting import owners diff --git a/test/test_option_setting.py b/test/test_option_setting.py index 9b4e511..b1c1e85 100644 --- a/test/test_option_setting.py +++ b/test/test_option_setting.py @@ -1,5 +1,7 @@ "config.set() or config.setoption() or option.setoption()" -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.setting import owners diff --git a/test/test_option_type.py b/test/test_option_type.py index 3537d6d..c80cc83 100644 --- a/test/test_option_type.py +++ b/test/test_option_type.py @@ -1,6 +1,8 @@ # coding: utf-8 "frozen and hidden values" -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config diff --git a/test/test_option_username.py b/test/test_option_username.py index 472e9cd..88c800b 100644 --- a/test/test_option_username.py +++ b/test/test_option_username.py @@ -1,5 +1,7 @@ "configuration objects global API" -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config diff --git a/test/test_option_validator.py b/test/test_option_validator.py index c30bcaa..d7af41d 100644 --- a/test/test_option_validator.py +++ b/test/test_option_validator.py @@ -1,4 +1,6 @@ -import autopath +from autopath import do_autopath +do_autopath() + import warnings from py.test import raises diff --git a/test/test_option_with_special_name.py b/test/test_option_with_special_name.py index 483aca0..63fe82f 100644 --- a/test/test_option_with_special_name.py +++ b/test/test_option_with_special_name.py @@ -1,5 +1,7 @@ #this test is much more to test that **it's there** and answers attribute access -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config diff --git a/test/test_parsing_group.py b/test/test_parsing_group.py index dc299d7..36d06d4 100644 --- a/test/test_parsing_group.py +++ b/test/test_parsing_group.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from tiramisu.setting import groups, owners from tiramisu.config import Config from tiramisu.option import ChoiceOption, BoolOption, IntOption, \ diff --git a/test/test_permissive.py b/test/test_permissive.py index 615fef7..99d3ac9 100644 --- a/test/test_permissive.py +++ b/test/test_permissive.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.option import IntOption, OptionDescription diff --git a/test/test_requires.py b/test/test_requires.py index c6d1032..02d1d36 100644 --- a/test/test_requires.py +++ b/test/test_requires.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from copy import copy from tiramisu import setting setting.expires_time = 1 diff --git a/test/test_reverse_from_path.py b/test/test_reverse_from_path.py deleted file mode 100644 index be43cac..0000000 --- a/test/test_reverse_from_path.py +++ /dev/null @@ -1,42 +0,0 @@ -#import autopath -#from py.test import raises - -#from tool import reverse_from_paths - -#def make_description(): -# gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref') -# gcdummy = BoolOption('dummy', 'dummy', default=False) -# objspaceoption = ChoiceOption('objspace', 'Object space', -# ['std', 'thunk'], 'std') -# booloption = BoolOption('bool', 'Test boolean option', default=True) -# intoption = IntOption('int', 'Test int option', default=0) -# floatoption = FloatOption('float', 'Test float option', default=2.3) -# stroption = StrOption('str', 'Test string option', default="abc") -# boolop = BoolOption('boolop', 'Test boolean option op', default=True) -# wantref_option = BoolOption('wantref', 'Test requires', default=False) -# wantframework_option = BoolOption('wantframework', 'Test requires', -# default=False) -# -# gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption]) -# descr = OptionDescription('tiram', '', [gcgroup, booloption, objspaceoption, -# wantref_option, stroption, -# wantframework_option, -# intoption, boolop]) -# return descr - -#def test_rebuild(): -# # pouvoir faire une comparaison avec equal -# d = {"s1.s2.s3.s4.a": True, "int": 43, "s2.b":True, "s3.c": True, "s3.d":[1,2,3]} -# cfg = reverse_from_paths(d) -# assert cfg.s1.s2.s3.s4.a == True -# assert cfg.int == 43 -# assert cfg.s2.b == True -# assert cfg.s3.c == True -# assert cfg.s3.d == [1,2,3] - -# assert config.getpaths() == ['gc.name', 'gc.dummy', 'gc.float', 'bool', -# 'objspace', 'wantref', 'str', 'wantframework', -# 'int', 'boolop'] - -# assert config.getpaths(include_groups=False) == ['gc.name', 'gc.dummy', 'gc.float', 'bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop'] -# assert config.getpaths(include_groups=True) == ['gc', 'gc.name', 'gc.dummy', 'gc.float', 'bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop'] diff --git a/test/test_slots.py b/test/test_slots.py index 225ccce..d3bfdd0 100644 --- a/test/test_slots.py +++ b/test/test_slots.py @@ -1,5 +1,7 @@ ## coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from py.test import raises from tiramisu.config import Config, SubConfig @@ -110,6 +112,7 @@ def test_slots_option_readonly_name(): p = DomainnameOption('p', '') q = DomainnameOption('q', '') m = OptionDescription('m', '', [a, b, c, d, e, f, g, h, i, j, k, l, o, p, q]) + m raises(AttributeError, "a._name = 'a'") raises(AttributeError, "b._name = 'b'") raises(AttributeError, "c._name = 'c'") @@ -154,6 +157,7 @@ def test_slots_setting(): od2 = OptionDescription('a', '', [od1]) c = Config(od2) s = c.cfgimpl_get_settings() + s raises(AttributeError, "s.x = 1") @@ -162,4 +166,5 @@ def test_slots_value(): od2 = OptionDescription('a', '', [od1]) c = Config(od2) v = c.cfgimpl_get_values() + v raises(AttributeError, "v.x = 1") diff --git a/test/test_state.py b/test/test_state.py index 1a5d5bf..22931a1 100644 --- a/test/test_state.py +++ b/test/test_state.py @@ -1,4 +1,5 @@ -import autopath +from autopath import do_autopath +do_autopath() from tiramisu.option import BoolOption, UnicodeOption, SymLinkOption, \ IntOption, IPOption, NetmaskOption, StrOption, OptionDescription, \ @@ -53,7 +54,7 @@ def _diff_opt(opt1, opt2): try: val1 = getattr(opt1, attr) msg1 = "exists" - except Exception, err: + except: err1 = True msg1 = "not exists" @@ -189,6 +190,7 @@ def test_diff_opt(): def test_only_optiondescription(): b = BoolOption('b', '') + b raises(SystemError, "a = dumps(b)") diff --git a/test/test_storage.py b/test/test_storage.py index fd3d743..8906c9e 100644 --- a/test/test_storage.py +++ b/test/test_storage.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + #from py.test import raises from tiramisu.config import Config diff --git a/test/test_submulti.py b/test/test_submulti.py index 6b5108f..ab9c03b 100644 --- a/test/test_submulti.py +++ b/test/test_submulti.py @@ -1,5 +1,7 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() + from tiramisu.setting import groups, owners from tiramisu.config import Config from tiramisu.option import StrOption, OptionDescription, submulti diff --git a/test/test_symlink.py b/test/test_symlink.py index 7f86837..648d752 100644 --- a/test/test_symlink.py +++ b/test/test_symlink.py @@ -1,5 +1,6 @@ # coding: utf-8 -import autopath +from autopath import do_autopath +do_autopath() from tiramisu.option import BoolOption, StrOption, SymLinkOption, \ OptionDescription @@ -109,6 +110,7 @@ def test_symlink_master(): ip_admin_eth0 = SymLinkOption('ip_admin_eth0', a) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "", multi=True) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + interface1 raises(ValueError, 'interface1.impl_set_group_type(groups.master)') @@ -117,4 +119,5 @@ def test_symlink_slaves(): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = SymLinkOption('netmask_admin_eth0', a) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + interface1 raises(ValueError, 'interface1.impl_set_group_type(groups.master)') diff --git a/tiramisu/config.py b/tiramisu/config.py index 546a522..5ecbd8c 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -20,7 +20,6 @@ # ____________________________________________________________ "options handler global entry point" import weakref -from copy import copy from tiramisu.error import PropertiesOptionError, ConfigError, ConflictError @@ -603,9 +602,16 @@ class _CommonConfig(SubConfig): fake_config = Config(self._impl_descr, persistent=False, force_storages=get_storages_validation(), force_settings=self.cfgimpl_get_settings()) - fake_config.cfgimpl_get_values()._p_._values = copy(self.cfgimpl_get_values()._p_.get_modified_values()) + fake_config.cfgimpl_get_values()._p_._values = self.cfgimpl_get_values()._p_.get_modified_values() return fake_config + def duplicate(self): + config = Config(self._impl_descr) + config.cfgimpl_get_values()._p_._values = self.cfgimpl_get_values()._p_.get_modified_values() + config.cfgimpl_get_settings()._p_._properties = self.cfgimpl_get_settings()._p_.get_modified_properties() + config.cfgimpl_get_settings()._p_._permissives = self.cfgimpl_get_settings()._p_.get_modified_permissives() + return config + # ____________________________________________________________ class Config(_CommonConfig): diff --git a/tiramisu/option/optiondescription.py b/tiramisu/option/optiondescription.py index 81851a5..8a3831e 100644 --- a/tiramisu/option/optiondescription.py +++ b/tiramisu/option/optiondescription.py @@ -302,6 +302,10 @@ class OptionDescription(BaseOption, StorageOptionDescription): def __getattr__(self, name, context=undefined): if name.startswith('_'): # or name.startswith('impl_'): return object.__getattribute__(self, name) + if '.' in name: + path = name.split('.')[0] + subpath = '.'.join(name.split('.')[1:]) + return self.__getattr__(path, context=context).__getattr__(subpath, context=context) return self._getattr(name, context=context) diff --git a/tiramisu/storage/dictionary/setting.py b/tiramisu/storage/dictionary/setting.py index fb76109..0422314 100644 --- a/tiramisu/storage/dictionary/setting.py +++ b/tiramisu/storage/dictionary/setting.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ____________________________________________________________ +from copy import copy from ..util import Cache @@ -58,10 +59,10 @@ class Settings(Cache): """return all modified settings in a dictionary example: {'path1': set(['prop1', 'prop2'])} """ - return self._properties + return copy(self._properties) def get_modified_permissives(self): """return all modified permissives in a dictionary example: {'path1': set(['perm1', 'perm2'])} """ - return self._permissives + return copy(self._permissives) diff --git a/tiramisu/storage/dictionary/value.py b/tiramisu/storage/dictionary/value.py index f0ffe3a..15b91fd 100644 --- a/tiramisu/storage/dictionary/value.py +++ b/tiramisu/storage/dictionary/value.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ____________________________________________________________ - +from copy import copy from ..util import Cache @@ -58,7 +58,7 @@ class Values(Cache): """return all values in a dictionary example: {'path1': (owner, 'value1'), 'path2': (owner, 'value2')} """ - return self._values + return copy(self._values) # owner def setowner(self, path, owner):