From: Darren S. <pha...@gm...> - 2015-04-21 22:00:36
|
Took a bit of a holiday from this, wanted to come back to it. Before going down the road further on finding a working string formatted configspec that works for this case (which from my perspective has so far been more complex than a Python use case arguably should be), I wanted to detour first and ask: is it possible to modify the configspec support to allow simply passing a Python list as an argument to option()? In my opinion this is possibly the cleanest and most flexible idiom (and least surprise for users I suspect). On Thu, Jan 22, 2015 at 6:19 AM, Rob Dennis <rd...@gm...> wrote: > Getting the same results implies that we're using the same version of > Python/configobj, which is nice. > > The real reason I wrote that example up was to give you a string formatted > configspec example that I believed should work, and one that appeared to be > formatted the same way your example was (But with a different error message > than what you had posted before). > > Is there a way to either link to your code repo, or at least paste the real > config file and validation code to a gist? > > > > On Thu, Jan 22, 2015 at 12:37 AM, Darren Spruell <pha...@gm...> > wrote: >> >> Same results running the Gist: >> >> $ python config_fest.py >> expected to fail: formatted: [(['bar'], 'category', VdtValueError('the >> value "unknown" is unacceptable.',))] >> expected to pass: formatted: [] >> expected to fail: unformatted: [(['bar'], 'category', >> VdtUnknownCheckError('the check "allowed_category_options" is >> unknown.',))] >> expected to pass: unformatted: [(['bar'], 'category', >> VdtUnknownCheckError('the check "allowed_category_options" is >> unknown.',))] >> >> I have to admit ignorance knowing quite how to interpret that though. >> >> - Darren >> >> (My turn to be sorry for a late reply). >> >> >> On Wed, Jan 14, 2015 at 8:31 AM, Rob Dennis <rd...@gm...> wrote: >> > (sorry for the late reply; work situation came up when I started to >> > reply >> > earlier, but I had already checked off that I had responded) >> > >> > I've taken your brief example and made a gist that you can execute: >> > https://gist.github.com/robdennis/bf13312a078fe8557101 >> > Unfortunately, I don't expect your example to work as written, since >> > it'd >> > need the constructed "option" string to be formatted into the >> > configspec. >> > >> > You have a different error message though, so I'm assuming there's some >> > other issue that's not obvious from what you included. >> > >> > the output I show for the test: >> > ``` >> > expected to fail: formatted: [(['bar'], 'category', VdtValueError('the >> > value >> > "unknown" is unacceptable.',))] >> > expected to pass: formatted: [] >> > expected to fail: unformatted: [(['bar'], 'category', >> > VdtUnknownCheckError('the check "allowed_category_options" is >> > unknown.',))] >> > expected to pass: unformatted: [(['bar'], 'category', >> > VdtUnknownCheckError('the check "allowed_category_options" is >> > unknown.',))] >> > ``` >> > >> > Maybe give it a shot and see if that gets your closer? >> > >> > On Sat, Jan 10, 2015 at 6:12 PM, Darren Spruell <pha...@gm...> >> > wrote: >> >> >> >> Thanks. I think it's on the right track (repr() didn't occur to me >> >> before), but although testing with Validator.check() works, I still >> >> get validation failures when using the resulting code within a >> >> configspec. >> >> >> >> BTW this is CPython 2.6.6. >> >> >> >> >> >> # DEFAULTS['CATEGORIES'] is the list() of categories >> >> allowed_category_options = "option({0})".format( >> >> ', '.join([repr(cat) for cat in DEFAULTS['CATEGORIES']]) >> >> ) >> >> >> >> CONFIGSPEC = '''\ >> >> logfile = string >> >> [foo] >> >> user = string >> >> pass = string >> >> [bar] >> >> [[__many__]] >> >> category = allowed_category_options >> >> ''' >> >> >> >> config = ConfigObj(conf_file, configspec=CONFIGSPEC.splitlines()) >> >> validator = Validator() >> >> results = config.validate(validator) >> >> >> >> >> >> Results in: >> >> The 'category' key in section 'bar, 2019761' failed validation >> >> >> >> Should this type of usage in a configspec (the way it's being parsed >> >> in my case) work correctly? >> >> >> >> DS >> >> >> >> >> >> On Sat, Jan 10, 2015 at 6:26 AM, Rob Dennis <rd...@gm...> wrote: >> >> > Hello Darren, >> >> > >> >> > I'm one of the current maintainers along with Eli, I'm modifying a >> >> > slightly >> >> > tweaked example from here: >> >> > >> >> > >> >> > https://configobj.readthedocs.org/en/latest/validate.html#the-standard-functions >> >> > >> >> > I'm seeing the behavior I expect for handcrafting the options >> >> > validator: >> >> >>>> from validate import Validator >> >> >>>> vtor = Validator() >> >> >>>> checked_val = vtor.check("option('option 1', 'option 2', 'option >> >> >>>> 3')", >> >> >>>> 'option 1') >> >> >>>> checked_val >> >> > 'option 1' >> >> >>>> checked_val = vtor.check("option('option 1', 'option 2', 'option >> >> >>>> 3')", >> >> >>>> 'option 4') >> >> > Traceback (most recent call last): >> >> > File "<stdin>", line 1, in <module> >> >> > File "validate.py", line 625, in check >> >> > return self._check_value(value, fun_name, fun_args, fun_kwargs) >> >> > File "validate.py", line 657, in _check_value >> >> > return fun(value, *fun_args, **fun_kwargs) >> >> > File "validate.py", line 1332, in is_option >> >> > raise VdtValueError(value) >> >> > validate.VdtValueError: the value "option 4" is unacceptable. >> >> > >> >> > >> >> > which if we tweak a bit more shows: >> >> >>>> my_categories = 'option 1', 'option 2', 'option 3' >> >> >>>> checked_val = vtor.check("option({})".format(', '.join(repr(cat) >> >> >>>> for >> >> >>>> cat >> >> >>>> in my_categories)), 'option 1') >> >> >>>> checked_val >> >> > 'option 1' >> >> > >> >> > note the example still does use join, but is also joining the repr of >> >> > each >> >> > element (to get the quotes around strings, mostly) >> >> >>>> "option({})".format(', '.join(repr(cat) for cat in my_categories)) >> >> > "option('option 1', 'option 2', 'option 3')" >> >> > >> >> > >> >> > Is this on the right track for what you need? >> >> > I'm out of contact for the next ~6 hours, but could try and respond >> >> > after >> >> > >> >> > On Sat, Jan 10, 2015 at 12:57 AM, Darren Spruell >> >> > <pha...@gm...> >> >> > wrote: >> >> >> >> >> >> I have a case in a script where I have a data structure defined in >> >> >> an >> >> >> external module, which is also a library we use in the script. I'd >> >> >> like to use that data in a DRY fashion in this script (which uses >> >> >> ConfigObj) by passing the structure (a list) as the argument to the >> >> >> option() validator. The reason for this is that the data in the >> >> >> target >> >> >> configuration field will ultimately be passed to the external module >> >> >> and will be validated against it, so the external module is >> >> >> essentially "authoritative" for the application. >> >> >> >> >> >> In the external module (mylib.py): >> >> >> >> >> >> CATEGORIES = ['WHITE', 'GREEN', 'AMBER', 'RED'] >> >> >> >> >> >> >> >> >> In the script: >> >> >> >> >> >> from mylib import CATEGORIES as allowed_categories >> >> >> >> >> >> CONFIGSPEC = '''\ >> >> >> logfile = string >> >> >> [foo] >> >> >> user = string >> >> >> pass = string >> >> >> [bar] >> >> >> [[__many__]] >> >> >> category = string >> >> >> ''' >> >> >> >> >> >> >> >> >> As shown I currently validate the 'category' option with string(), >> >> >> but >> >> >> I'd really like to use option() instead with the set of choices >> >> >> taken >> >> >> from the list imported from mylib; something like the following: >> >> >> >> >> >> category = option(allowed_categories) >> >> >> >> >> >> That syntax doesn't work and various attempts to coerce the list >> >> >> into >> >> >> a string that resembles a list of allowed values with join() hasn't >> >> >> done the trick. Is there currently a way to get this to function as >> >> >> I >> >> >> want? Any way to allow option() to accept a tuple or list as the >> >> >> arguments to ease working with structured data for that validator? >> >> >> >> >> >> -- >> >> >> Darren Spruell >> >> >> pha...@gm... >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> ------------------------------------------------------------------------------ >> >> >> Dive into the World of Parallel Programming! The Go Parallel >> >> >> Website, >> >> >> sponsored by Intel and developed in partnership with Slashdot Media, >> >> >> is >> >> >> your >> >> >> hub for all things parallel software development, from weekly >> >> >> thought >> >> >> leadership blogs to news, videos, case studies, tutorials and more. >> >> >> Take a >> >> >> look and join the conversation now. >> >> >> http://goparallel.sourceforge.net >> >> >> _______________________________________________ >> >> >> Configobj-develop mailing list >> >> >> Con...@li... >> >> >> https://lists.sourceforge.net/lists/listinfo/configobj-develop >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > ------------------------------------------------------------------------------ >> >> > Dive into the World of Parallel Programming! The Go Parallel Website, >> >> > sponsored by Intel and developed in partnership with Slashdot Media, >> >> > is >> >> > your >> >> > hub for all things parallel software development, from weekly thought >> >> > leadership blogs to news, videos, case studies, tutorials and more. >> >> > Take >> >> > a >> >> > look and join the conversation now. http://goparallel.sourceforge.net >> >> > _______________________________________________ >> >> > Configobj-develop mailing list >> >> > Con...@li... >> >> > https://lists.sourceforge.net/lists/listinfo/configobj-develop >> >> > >> >> >> >> >> >> >> >> -- >> >> Darren Spruell >> >> pha...@gm... >> >> >> >> >> >> >> >> ------------------------------------------------------------------------------ >> >> Dive into the World of Parallel Programming! The Go Parallel Website, >> >> sponsored by Intel and developed in partnership with Slashdot Media, is >> >> your >> >> hub for all things parallel software development, from weekly thought >> >> leadership blogs to news, videos, case studies, tutorials and more. >> >> Take a >> >> look and join the conversation now. http://goparallel.sourceforge.net >> >> _______________________________________________ >> >> Configobj-develop mailing list >> >> Con...@li... >> >> https://lists.sourceforge.net/lists/listinfo/configobj-develop >> > >> > >> > >> > >> > ------------------------------------------------------------------------------ >> > New Year. New Location. New Benefits. New Data Center in Ashburn, VA. >> > GigeNET is offering a free month of service with a new server in >> > Ashburn. >> > Choose from 2 high performing configs, both with 100TB of bandwidth. >> > Higher redundancy.Lower latency.Increased capacity.Completely compliant. >> > http://p.sf.net/sfu/gigenet >> > _______________________________________________ >> > Configobj-develop mailing list >> > Con...@li... >> > https://lists.sourceforge.net/lists/listinfo/configobj-develop >> > >> >> >> >> -- >> Darren Spruell >> pha...@gm... >> >> >> ------------------------------------------------------------------------------ >> New Year. New Location. New Benefits. New Data Center in Ashburn, VA. >> GigeNET is offering a free month of service with a new server in Ashburn. >> Choose from 2 high performing configs, both with 100TB of bandwidth. >> Higher redundancy.Lower latency.Increased capacity.Completely compliant. >> http://p.sf.net/sfu/gigenet >> _______________________________________________ >> Configobj-develop mailing list >> Con...@li... >> https://lists.sourceforge.net/lists/listinfo/configobj-develop > > > > ------------------------------------------------------------------------------ > New Year. New Location. New Benefits. New Data Center in Ashburn, VA. > GigeNET is offering a free month of service with a new server in Ashburn. > Choose from 2 high performing configs, both with 100TB of bandwidth. > Higher redundancy.Lower latency.Increased capacity.Completely compliant. > http://p.sf.net/sfu/gigenet > _______________________________________________ > Configobj-develop mailing list > Con...@li... > https://lists.sourceforge.net/lists/listinfo/configobj-develop > -- Darren Spruell pha...@gm... |