|
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...
|