You can subscribe to this list here.
| 2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
(2) |
Nov
(18) |
Dec
(26) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2006 |
Jan
(14) |
Feb
(28) |
Mar
(21) |
Apr
(17) |
May
(23) |
Jun
(12) |
Jul
(12) |
Aug
(7) |
Sep
(10) |
Oct
|
Nov
(4) |
Dec
(10) |
| 2007 |
Jan
(5) |
Feb
(8) |
Mar
|
Apr
|
May
(7) |
Jun
(1) |
Jul
(3) |
Aug
(3) |
Sep
(20) |
Oct
(3) |
Nov
(2) |
Dec
(12) |
| 2008 |
Jan
(40) |
Feb
(15) |
Mar
(1) |
Apr
|
May
(6) |
Jun
(19) |
Jul
(2) |
Aug
(17) |
Sep
(13) |
Oct
(7) |
Nov
(16) |
Dec
(5) |
| 2009 |
Jan
(15) |
Feb
(11) |
Mar
(11) |
Apr
(8) |
May
(6) |
Jun
(15) |
Jul
(19) |
Aug
(2) |
Sep
|
Oct
(19) |
Nov
(1) |
Dec
(3) |
| 2010 |
Jan
(12) |
Feb
(25) |
Mar
(45) |
Apr
(4) |
May
(2) |
Jun
(4) |
Jul
(6) |
Aug
(13) |
Sep
(1) |
Oct
(2) |
Nov
(2) |
Dec
(9) |
| 2011 |
Jan
(24) |
Feb
(7) |
Mar
(1) |
Apr
(6) |
May
(3) |
Jun
(3) |
Jul
|
Aug
(13) |
Sep
(9) |
Oct
(7) |
Nov
(17) |
Dec
|
| 2012 |
Jan
|
Feb
|
Mar
(5) |
Apr
(3) |
May
|
Jun
|
Jul
(3) |
Aug
(2) |
Sep
(4) |
Oct
|
Nov
|
Dec
|
| 2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(12) |
Oct
|
Nov
|
Dec
|
| 2014 |
Jan
(4) |
Feb
(3) |
Mar
|
Apr
(17) |
May
|
Jun
|
Jul
|
Aug
(5) |
Sep
(3) |
Oct
(3) |
Nov
|
Dec
|
| 2015 |
Jan
(11) |
Feb
|
Mar
|
Apr
(2) |
May
(1) |
Jun
|
Jul
|
Aug
(3) |
Sep
|
Oct
|
Nov
|
Dec
|
| 2016 |
Jan
|
Feb
(2) |
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
(10) |
Dec
|
| 2017 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Scott F. <sc...@st...> - 2009-06-08 11:40:51
|
That works great for my purpose. Thanks for that.
On Mon, Jun 8, 2009 at 6:01 AM, Michael Foord <fuz...@vo...>wrote:
> Scott Flynn wrote:
> > That works for me. Thanks. One other thing, is it possible to make the
> > keys in a ConfigObj case insensitive?
>
> Not directly I'm afraid. You could fetch all the keys and do a case
> insensitive match though:
>
>
> def get_value_case_insensitive(key, section):
> keys = dict([(entry.lower(), entry) for entry in section.keys()])
> real_key = keys[key.lower()] # will raise KeyError if key is not found
> return section[real_key]
>
>
> config = ConfigObj(filename)
> section = get_value_case_insensitive('my_Timer', config) # fetch the
> section case-insensitively
> value = get_value_case_insensitive('some_key', section) # fetch the
> required key case-insensitively
>
> HTH
>
> Michael
>
> >
> > On Sun, Jun 7, 2009 at 3:29 PM, Michael Foord
> > <fuz...@vo... <mailto:fuz...@vo...>> wrote:
> >
> > Scott Flynn wrote:
> > > Does anyone have a vim syntax file for Config Object?
> > >
> >
> > Not me.
> >
> > > Second, I want to know if there's a way to have defaults for
> > sections
> > > where the name is only partially known.
> > >
> > > For instance:
> > >
> > > [widget_MyTimer]
> > > type="timer"
> > > interval=500
> > > expression=doAction()
> > >
> > > And it may also have a precision option but this widget doesn't
> need
> > > it since the expression's not mathematical. This precision is
> > supposed
> > > to be 1000 if missing, not that it matters in this case, meaning
> > > precision limited by Python's natural floating point precision. Can
> > > that be done on Config Object's side?
> >
> > Not *really* sure what you want here. One way to do it would be to
> use
> > the get method where you can supply a default if the key is missing:
> >
> > config = ConfigObj(filename)
> > timer = config['widget_MyTimer']
> > precision = timer.get('precision', '1000')
> >
> > All the best,
> >
> >
> > Michael
> >
> > >
> >
> ------------------------------------------------------------------------
> > >
> > >
> >
> ------------------------------------------------------------------------------
> > > OpenSolaris 2009.06 is a cutting edge operating system for
> > enterprises
> > > looking to deploy the next generation of Solaris that includes
> > the latest
> > > innovations from Sun and the OpenSource community. Download a
> > copy and
> > > enjoy capabilities such as Networking, Storage and Virtualization.
> > > Go to: http://p.sf.net/sfu/opensolaris-get
> > >
> >
> ------------------------------------------------------------------------
> > >
> > > _______________________________________________
> > > Configobj-develop mailing list
> > > Con...@li...
> > <mailto:Con...@li...>
> > > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> > >
> >
> >
> > --
> > http://www.ironpythoninaction.com/
> > http://www.voidspace.org.uk/blog
> >
> >
> >
> >
> ------------------------------------------------------------------------------
> > OpenSolaris 2009.06 is a cutting edge operating system for
> enterprises
> > looking to deploy the next generation of Solaris that includes the
> > latest
> > innovations from Sun and the OpenSource community. Download a copy
> and
> > enjoy capabilities such as Networking, Storage and Virtualization.
> > Go to: http://p.sf.net/sfu/opensolaris-get
> > _______________________________________________
> > Configobj-develop mailing list
> > Con...@li...
> > <mailto:Con...@li...>
> > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> >
> >
> > ------------------------------------------------------------------------
> >
> >
> ------------------------------------------------------------------------------
> > OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> > looking to deploy the next generation of Solaris that includes the latest
> > innovations from Sun and the OpenSource community. Download a copy and
> > enjoy capabilities such as Networking, Storage and Virtualization.
> > Go to: http://p.sf.net/sfu/opensolaris-get
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Configobj-develop mailing list
> > Con...@li...
> > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> >
>
>
> --
> http://www.ironpythoninaction.com/
> http://www.voidspace.org.uk/blog
>
>
>
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
|
|
From: Michael F. <fuz...@vo...> - 2009-06-08 11:01:55
|
Scott Flynn wrote:
> That works for me. Thanks. One other thing, is it possible to make the
> keys in a ConfigObj case insensitive?
Not directly I'm afraid. You could fetch all the keys and do a case
insensitive match though:
def get_value_case_insensitive(key, section):
keys = dict([(entry.lower(), entry) for entry in section.keys()])
real_key = keys[key.lower()] # will raise KeyError if key is not found
return section[real_key]
config = ConfigObj(filename)
section = get_value_case_insensitive('my_Timer', config) # fetch the
section case-insensitively
value = get_value_case_insensitive('some_key', section) # fetch the
required key case-insensitively
HTH
Michael
>
> On Sun, Jun 7, 2009 at 3:29 PM, Michael Foord
> <fuz...@vo... <mailto:fuz...@vo...>> wrote:
>
> Scott Flynn wrote:
> > Does anyone have a vim syntax file for Config Object?
> >
>
> Not me.
>
> > Second, I want to know if there's a way to have defaults for
> sections
> > where the name is only partially known.
> >
> > For instance:
> >
> > [widget_MyTimer]
> > type="timer"
> > interval=500
> > expression=doAction()
> >
> > And it may also have a precision option but this widget doesn't need
> > it since the expression's not mathematical. This precision is
> supposed
> > to be 1000 if missing, not that it matters in this case, meaning
> > precision limited by Python's natural floating point precision. Can
> > that be done on Config Object's side?
>
> Not *really* sure what you want here. One way to do it would be to use
> the get method where you can supply a default if the key is missing:
>
> config = ConfigObj(filename)
> timer = config['widget_MyTimer']
> precision = timer.get('precision', '1000')
>
> All the best,
>
>
> Michael
>
> >
> ------------------------------------------------------------------------
> >
> >
> ------------------------------------------------------------------------------
> > OpenSolaris 2009.06 is a cutting edge operating system for
> enterprises
> > looking to deploy the next generation of Solaris that includes
> the latest
> > innovations from Sun and the OpenSource community. Download a
> copy and
> > enjoy capabilities such as Networking, Storage and Virtualization.
> > Go to: http://p.sf.net/sfu/opensolaris-get
> >
> ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Configobj-develop mailing list
> > Con...@li...
> <mailto:Con...@li...>
> > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> >
>
>
> --
> http://www.ironpythoninaction.com/
> http://www.voidspace.org.uk/blog
>
>
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the
> latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> <mailto:Con...@li...>
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
>
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> ------------------------------------------------------------------------
>
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
--
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog
|
|
From: Scott F. <sc...@st...> - 2009-06-08 00:56:27
|
That works for me. Thanks. One other thing, is it possible to make the keys
in a ConfigObj case insensitive?
On Sun, Jun 7, 2009 at 3:29 PM, Michael Foord <fuz...@vo...>wrote:
> Scott Flynn wrote:
> > Does anyone have a vim syntax file for Config Object?
> >
>
> Not me.
>
> > Second, I want to know if there's a way to have defaults for sections
> > where the name is only partially known.
> >
> > For instance:
> >
> > [widget_MyTimer]
> > type="timer"
> > interval=500
> > expression=doAction()
> >
> > And it may also have a precision option but this widget doesn't need
> > it since the expression's not mathematical. This precision is supposed
> > to be 1000 if missing, not that it matters in this case, meaning
> > precision limited by Python's natural floating point precision. Can
> > that be done on Config Object's side?
>
> Not *really* sure what you want here. One way to do it would be to use
> the get method where you can supply a default if the key is missing:
>
> config = ConfigObj(filename)
> timer = config['widget_MyTimer']
> precision = timer.get('precision', '1000')
>
> All the best,
>
>
> Michael
>
> > ------------------------------------------------------------------------
> >
> >
> ------------------------------------------------------------------------------
> > OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> > looking to deploy the next generation of Solaris that includes the latest
> > innovations from Sun and the OpenSource community. Download a copy and
> > enjoy capabilities such as Networking, Storage and Virtualization.
> > Go to: http://p.sf.net/sfu/opensolaris-get
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Configobj-develop mailing list
> > Con...@li...
> > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> >
>
>
> --
> http://www.ironpythoninaction.com/
> http://www.voidspace.org.uk/blog
>
>
>
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
|
|
From: Michael F. <fuz...@vo...> - 2009-06-07 20:29:51
|
Scott Flynn wrote:
> Does anyone have a vim syntax file for Config Object?
>
Not me.
> Second, I want to know if there's a way to have defaults for sections
> where the name is only partially known.
>
> For instance:
>
> [widget_MyTimer]
> type="timer"
> interval=500
> expression=doAction()
>
> And it may also have a precision option but this widget doesn't need
> it since the expression's not mathematical. This precision is supposed
> to be 1000 if missing, not that it matters in this case, meaning
> precision limited by Python's natural floating point precision. Can
> that be done on Config Object's side?
Not *really* sure what you want here. One way to do it would be to use
the get method where you can supply a default if the key is missing:
config = ConfigObj(filename)
timer = config['widget_MyTimer']
precision = timer.get('precision', '1000')
All the best,
Michael
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> ------------------------------------------------------------------------
>
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
--
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog
|
|
From: Scott S. <sis...@gm...> - 2009-06-07 15:05:37
|
Ok yeah I was confused. I figured out the problem. I guess my LCD can't
handle octal sequences.
On Sun, Jun 7, 2009 at 8:15 AM, David Hostetler <neg...@gm...>wrote:
> Note that {'expression': '\\200'} is the repr view of the dict entry.
> Strings will show any escaped character using the escape seq ('\'). In
> other words -- it's actually showing you that there _is_ a normal slash
> included in the string.
>
> I.e. -- are you sure there's a problem?
>
> If you do: print dict['expression'] then you'll get '\200', which is
> presumably exactly what you intended.
>
> This is a common python user misunderstanding.
>
> Observe the following:
>
> >>> x = 'a\\b\nc'
> >>> x
> 'a\\b\nc'
> >>> print x
> a\b
> c
> >>> print repr(x)
> 'a\\b\nc'
>
>
>
> regards,
>
> - David Hostetler
>
>
>
> On Sun, Jun 7, 2009 at 08:54, Scott Sibley <sis...@gm...> wrote:
>
>> Sorry if this got sent twice.
>>
>> I'm probably just looking over the answer.
>>
>> The following:
>>
>> [widget_foo]
>> expression='\200'
>>
>> Turns into this:
>>
>> {'expression': '\\200'}
>>
>> Note the extra backslash. Any solution?
>>
>>
>>
>> ------------------------------------------------------------------------------
>> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
>> looking to deploy the next generation of Solaris that includes the latest
>> innovations from Sun and the OpenSource community. Download a copy and
>> enjoy capabilities such as Networking, Storage and Virtualization.
>> Go to: http://p.sf.net/sfu/opensolaris-get
>> _______________________________________________
>> Configobj-develop mailing list
>> Con...@li...
>> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>>
>>
>
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
>
|
|
From: David H. <neg...@gm...> - 2009-06-07 13:18:33
|
Note that {'expression': '\\200'} is the repr view of the dict entry.
Strings will show any escaped character using the escape seq ('\'). In
other words -- it's actually showing you that there _is_ a normal slash
included in the string.
I.e. -- are you sure there's a problem?
If you do: print dict['expression'] then you'll get '\200', which is
presumably exactly what you intended.
This is a common python user misunderstanding.
Observe the following:
>>> x = 'a\\b\nc'
>>> x
'a\\b\nc'
>>> print x
a\b
c
>>> print repr(x)
'a\\b\nc'
regards,
- David Hostetler
On Sun, Jun 7, 2009 at 08:54, Scott Sibley <sis...@gm...> wrote:
> Sorry if this got sent twice.
>
> I'm probably just looking over the answer.
>
> The following:
>
> [widget_foo]
> expression='\200'
>
> Turns into this:
>
> {'expression': '\\200'}
>
> Note the extra backslash. Any solution?
>
>
>
> ------------------------------------------------------------------------------
> OpenSolaris 2009.06 is a cutting edge operating system for enterprises
> looking to deploy the next generation of Solaris that includes the latest
> innovations from Sun and the OpenSource community. Download a copy and
> enjoy capabilities such as Networking, Storage and Virtualization.
> Go to: http://p.sf.net/sfu/opensolaris-get
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
>
|
|
From: Scott S. <sis...@gm...> - 2009-06-07 12:55:48
|
I'm probably just looking over the answer.
The following:
[widget_foo]
expression='\200'
Turns into this:
{'expression': '\\200'}
Note the extra backslash. Any solution?
|
|
From: Scott S. <sis...@gm...> - 2009-06-07 12:54:43
|
Sorry if this got sent twice.
I'm probably just looking over the answer.
The following:
[widget_foo]
expression='\200'
Turns into this:
{'expression': '\\200'}
Note the extra backslash. Any solution?
|
|
From: Scott F. <sc...@st...> - 2009-06-07 05:52:37
|
Does anyone have a vim syntax file for Config Object? Second, I want to know if there's a way to have defaults for sections where the name is only partially known. For instance: [widget_MyTimer] type="timer" interval=500 expression=doAction() And it may also have a precision option but this widget doesn't need it since the expression's not mathematical. This precision is supposed to be 1000 if missing, not that it matters in this case, meaning precision limited by Python's natural floating point precision. Can that be done on Config Object's side? |
|
From: Michael F. <fuz...@vo...> - 2009-05-21 21:51:27
|
Ken Kuhlman wrote: > > On Wed, May 20, 2009 at 1:40 PM, Ken Kuhlman <ksk...@gm... > <mailto:ksk...@gm...>> wrote: > > > On Sat, May 16, 2009 at 6:47 AM, Michael Foord > <fuz...@vo... <mailto:fuz...@vo...>> wrote: > > Hello Ken, > > I'll look at this. A problem with eval is that it is unsafe > (arbitrary > code execution) - which is one reason to use a text based config > system in the first place. > > Michael > > -- > http://www.ironpythoninaction.com > > > Thanks Michael. After doing some more digging around it looks > like this is as much a Python 3 issue as anything, and that the > ast module is the preferred long-term solution. > > I think I'll break jython support (ignoring unrepr) out into it's > own ticket, and create another for using ast when compiler isn't > available. The differences between the APIs is giving me fits, > though, so I'm not going to make any promises that the latter will > come with a working patch. > > > I got the ast-based Builder fully working. I ended up combining the > patches after all, though, since there was some overlap in the imports. > > Ticket #3 on google code. Cool - great. I'll look at the best way of integrating this. ConfigObj will need something of a rewrite for Python 3 anyway as the unicode handling will be different (although not massively different come to think of it). No-one has asked me for a Python 3 version yet anyway. :-) Many thanks, Michael > > Thanks, > -Ken > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------------ > Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT > is a gathering of tech-side developers & brand creativity professionals. Meet > the minds behind Google Creative Lab, Visual Complexity, Processing, & > iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian > Group, R/GA, & Big Spaceship. http://www.creativitycat.com > ------------------------------------------------------------------------ > > _______________________________________________ > Configobj-develop mailing list > Con...@li... > https://lists.sourceforge.net/lists/listinfo/configobj-develop > -- http://www.ironpythoninaction.com/ http://www.voidspace.org.uk/blog |
|
From: Ken K. <ksk...@gm...> - 2009-05-21 17:44:27
|
On Wed, May 20, 2009 at 1:40 PM, Ken Kuhlman <ksk...@gm...> wrote: > > On Sat, May 16, 2009 at 6:47 AM, Michael Foord <fuz...@vo...>wrote: > >> Hello Ken, >> >> I'll look at this. A problem with eval is that it is unsafe (arbitrary >> code execution) - which is one reason to use a text based config >> system in the first place. >> >> Michael >> >> -- >> http://www.ironpythoninaction.com >> > > Thanks Michael. After doing some more digging around it looks like this is > as much a Python 3 issue as anything, and that the ast module is the > preferred long-term solution. > > I think I'll break jython support (ignoring unrepr) out into it's own > ticket, and create another for using ast when compiler isn't available. The > differences between the APIs is giving me fits, though, so I'm not going to > make any promises that the latter will come with a working patch. > > I got the ast-based Builder fully working. I ended up combining the patches after all, though, since there was some overlap in the imports. Ticket #3 on google code. Thanks, -Ken |
|
From: Ken K. <ksk...@gm...> - 2009-05-20 18:40:55
|
On Sat, May 16, 2009 at 6:47 AM, Michael Foord <fuz...@vo...>wrote: > Hello Ken, > > I'll look at this. A problem with eval is that it is unsafe (arbitrary > code execution) - which is one reason to use a text based config > system in the first place. > > Michael > > -- > http://www.ironpythoninaction.com > Thanks Michael. After doing some more digging around it looks like this is as much a Python 3 issue as anything, and that the ast module is the preferred long-term solution. I think I'll break jython support (ignoring unrepr) out into it's own ticket, and create another for using ast when compiler isn't available. The differences between the APIs is giving me fits, though, so I'm not going to make any promises that the latter will come with a working patch. Anyway, there's no huge hurry here. In the short term, I can follow Dag's lead & just monkey-patch unrepr with eval. The potential security concerns with eval aren't important for my use case. thanks, -Ken |
|
From: Ken K. <ke...@re...> - 2009-05-20 18:33:47
|
On Sat, May 16, 2009 at 6:47 AM, Michael Foord <fuz...@vo...>wrote: > Hello Ken, > > I'll look at this. A problem with eval is that it is unsafe (arbitrary > code execution) - which is one reason to use a text based config > system in the first place. > > Michael > > -- > http://www.ironpythoninaction.com > > Thanks Michael. After doing some more digging around it looks like this is as much a Python 3 issue as anything, and that the ast module is the preferred long-term solution. I think I'll break jython support (ignoring unrepr) out into it's own ticket, and create another for using ast when compiler isn't available. The differences between the APIs is giving me fits, though, so I'm not going to make any promises that the latter will come with a working patch. Anyway, there's no huge hurry here. In the short term, I can follow Dag's lead & just monkey-patch unrepr with eval. The potential security concerns with eval aren't important for my use case. thanks, -Ken |
|
From: Michael F. <fuz...@vo...> - 2009-05-16 13:00:08
|
Hello Ken, I'll look at this. A problem with eval is that it is unsafe (arbitrary code execution) - which is one reason to use a text based config system in the first place. Michael -- http://www.ironpythoninaction.com On 16 May 2009, at 03:55, Ken Kuhlman <ksk...@gm...> wrote: > As a first time poster, let me first thank you for configobj. It's > a nice piece of work, and the fact that I've never really had to > think about it is a real testament to your ability to put out stable > releases that 'just work'. > > Lately, though, I've been drawn to 'alternate' python > implementations: jython, fepy, appengine, pypy and such. Unlike > cpython, these don't provide a working compiler.parser, which means > that the unrepr mode of configobj doesn't work under them. > > I noticed Dag Brattli & Fuzzyman's tweets, which suggested eval as a > workable replacement, and came up with the attached patch against > the current rev (19). The core of the patch is very > straightforward, though I had to make some trivial changes to the > tests get them to pass under Jython. > > Since there's already some minor import trickery in configobj for > IronPython, I'm hoping that this patch is acceptable. Let me know > if need me to create a ticket. > > Thanks again, > -Ken > > PS: You won't want to commit the "configobj.compiler = None" line > in test_configobj.py. It's just there to demo unrepr in the absence > of a working compiler module. > > <nocompiler.diff> > --- > --- > --- > --------------------------------------------------------------------- > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensing option that enables > unlimited royalty-free distribution of the report engine > for externally facing server and web deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > Configobj-develop mailing list > Con...@li... > https://lists.sourceforge.net/lists/listinfo/configobj-develop |
|
From: <fuz...@vo...> - 2009-04-16 22:05:21
|
{ran_emo} Finally a fresh release `ConfigObj </python/configobj.html>`_ and `Validate </python/validate.html>`_.
* `ConfigObj 4.6.0 on PyPI <http://pypi.python.org/pypi/ConfigObj/>`_
* `Validate 1.0.0 on PyPI <http://pypi.python.org/pypi/validate/>`_
**ConfigObj** is a simple to use but powerful Python library for the reading and writing of configuration (ini) files. Through **Validate** it integrates a config file validation and type conversion system.
Features of ConfigObj include:
* Nested sections (subsections), to any level
* List values
* Multiple line values
* Full Unicode support
* String interpolation (substitution)
* Integrated with a powerful validation system
- including automatic type checking/conversion
- and allowing default values
- repeated sections
* All comments in the file are preserved
* The order of keys/sections is preserved
* Powerful ``unrepr`` mode for storing/retrieving Python data-types
Release 4.6.0 fixes bugs and adds new features, particularly making configspec handling more flexible.
The full changelog for ConfigObj 4.6.0 is:
* Pickling of ConfigObj instances now supported (thanks to Christian Heimes)
* Hashes in confgspecs are now allowed (see note below)
* Replaced use of hasattr (which can swallow exceptions) with getattr
* ``__many__`` in configspecs can refer to scalars (ordinary values) as well as sections
* You can use ``___many___`` (three underscores!) where you want to use ``__many__`` as well
* You can now have normal sections inside configspec sections that use ``__many__``
* You can now create an empty ConfigObj with a configspec, programmatically set values and then validate
* A section that was supplied as a value (or vice-versa) in the actual config file would cause an exception during validation (the config file is still broken of course, but it is now handled gracefully)
* Added ``as_list`` method
* Removed the deprecated ``istrue``, ``encode`` and ``decode`` methods
* Running test_configobj.py now also runs the doctests in the configobj module
* Through the use of validate 1.0.0 ConfigObj can now validate multi-line values
As a consequence of the changes to configspec handling, when you create a ConfigObj instance and provide
a configspec, the configspec attribute is only set on the ConfigObj instance - it isn't set on the
sections until you validate. You also can't set the configspec attribute to be a dictionary. This wasn't
documented but did work previously.
In order to fix the problem with hashes in configspecs I had to turn off the parsing of inline comments
in configspecs. This will only affect you if you are using ``copy=True`` when validating and expecting
inline comments to be copied from the configspec into the ConfigObj instance (all other comments will be
copied as usual).
If you *create* the configspec by passing in a ConfigObj instance (usual way is to pass in a filename or
list of lines) then you should pass in ``_inspec=True`` to the constructor to allow hashes in values.
This is the magic that switches off inline comment parsing.
As the public API for Validate is stable, and there are no outstanding issues or feature requests, I've bumped the version number to 1.0.0. The full change log is:
* BUGFIX: can now handle multiline strings
* Addition of 'force_list' validation option
You should be able to install ConfigObj (which includes Validate in the source distribution on PyPI) using ``pip`` or ``easy_install``. |
|
From: <fuz...@vo...> - 2009-04-16 21:50:16
|
{ran_emo} Finally a fresh release `ConfigObj </python/configobj.html>`_ and `Validate </python/validate.html>`_.
* `ConfigObj 4.6.0 on PyPI <http://pypi.python.org/pypi/ConfigObj/>`_
* `Validate 1.0.0 on PyPI <http://pypi.python.org/pypi/validate/>`_
**ConfigObj** is a simple to use but powerful Python library for the reading and writing of configuration (ini) files. Through **Validate** it integrates a config file validation and type conversion system.
Features of ConfigObj include:
* Nested sections (subsections), to any level
* List values
* Multiple line values
* Full Unicode support
* String interpolation (substitution)
* Integrated with a powerful validation system
- including automatic type checking/conversion
- and allowing default values
- repeated sections
* All comments in the file are preserved
* The order of keys/sections is preserved
* Powerful ``unrepr`` mode for storing/retrieving Python data-types
Release 4.6.0 fixes bugs and adds new features, particularly making configspec handling more flexible.
The full changelog for ConfigObj 4.6.0 is:
* Pickling of ConfigObj instances now supported (thanks to Christian Heimes)
* Hashes in confgspecs are now allowed (see note below)
* Replaced use of hasattr (which can swallow exceptions) with getattr
* ``__many__`` in configspecs can refer to scalars (ordinary values) as well as sections
* You can use ``___many___`` (three underscores!) where you want to use ``__many__`` as well
* You can now have normal sections inside configspec sections that use ``__many__``
* You can now create an empty ConfigObj with a configspec, programmatically set values and then validate
* A section that was supplied as a value (or vice-versa) in the actual config file would cause an exception during validation (the config file is still broken of course, but it is now handled gracefully)
* Added ``as_list`` method
* Removed the deprecated ``istrue``, ``encode`` and ``decode`` methods
* Running test_configobj.py now also runs the doctests in the configobj module
* Through the use of validate 1.0.0 ConfigObj can now validate multi-line values
As a consequence of the changes to configspec handling, when you create a ConfigObj instance and provide
a configspec, the configspec attribute is only set on the ConfigObj instance - it isn't set on the
sections until you validate. You also can't set the configspec attribute to be a dictionary. This wasn't
documented but did work previously.
In order to fix the problem with hashes in configspecs I had to turn off the parsing of inline comments
in configspecs. This will only affect you if you are using ``copy=True`` when validating and expecting
inline comments to be copied from the configspec into the ConfigObj instance (all other comments will be
copied as usual).
If you *create* the configspec by passing in a ConfigObj instance (usual way is to pass in a filename or
list of lines) then you should pass in ``_inspec=True`` to the constructor to allow hashes in values.
This is the magic that switches off inline comment parsing.
As the public API for Validate is stable, and there are no outstanding issues or feature requests, I've bumped the version number to 1.0.0. The full change log is:
* BUGFIX: can now handle multiline strings
* Addition of 'force_list' validation option
You should be able to install ConfigObj (which includes Validate in the source distribution on PyPI) using ``pip`` or ``easy_install``. |
|
From: Arve K. <arv...@gm...> - 2009-04-15 11:47:41
|
Sounds like a positive development (excuse the pun) :) Google Code is pretty cool to work with, IMO. Arve On Mon, Apr 13, 2009 at 9:32 PM, Michael Foord <fuz...@vo...>wrote: > Hello all, > > I've moved ConfigObj out of the pythonutils repository (pythonutils as a > project is basically dead) and into its own project on Google Code. > > http://code.google.com/p/configobj/ > > I'm now actively working on the 4.6.0 release. Sorry for the delay. > > Michael > > -- > http://www.ironpythoninaction.com/ > http://www.voidspace.org.uk/blog > > > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by: > High Quality Requirements in a Collaborative Environment. > Download a free trial of Rational Requirements Composer Now! > http://p.sf.net/sfu/www-ibm-com > _______________________________________________ > Configobj-develop mailing list > Con...@li... > https://lists.sourceforge.net/lists/listinfo/configobj-develop > |
|
From: Michael F. <fuz...@vo...> - 2009-04-14 09:42:21
|
Ramon Felciano wrote:
> Hi --
>
> I'm trying to migrate a bunch of hard-coded configuration information
> to an external INI file with ConfigObj. I am using this in a Python
> package that has a bunch of individual files, typically called from
> the command line, as well as library or utility scripts that are
> called from the command-line files. I'd like any of these to have
> access to a shared, parsed configuration object, but I'm not actually
> sure how to implement that elegantly. I would imagine this is common
> for ConfigObj users that just want config info loaded once per
> invocation. Is there a pythonic way of handling singleton patterns
> like this? Should I stick the ConfigObj loader in a separate config.py
> file that is loaded from each other script?
Having a single module ('config.py' or whatever) responsible for
retrieving configuration information is a pattern I have seen used
several times before. Modules are effectively singletons in Python so it
is an effective way of dividing responsibilities.
Michael
>
> Thanks!
>
> Ramon
>
> P.S. I'm not actually sure I need a singleton in the OO sense: the
> configuration info doesn't need to be wrapped in a class instance, but
> just needs a simple way to access the loaded configuration object.
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by:
> High Quality Requirements in a Collaborative Environment.
> Download a free trial of Rational Requirements Composer Now!
> http://p.sf.net/sfu/www-ibm-com
> ------------------------------------------------------------------------
>
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
--
http://www.ironpythoninaction.com/
|
|
From: Ramon F. <fel...@ya...> - 2009-04-14 06:01:48
|
Hi -- I'm trying to migrate a bunch of hard-coded configuration information to an external INI file with ConfigObj. I am using this in a Python package that has a bunch of individual files, typically called from the command line, as well as library or utility scripts that are called from the command-line files. I'd like any of these to have access to a shared, parsed configuration object, but I'm not actually sure how to implement that elegantly. I would imagine this is common for ConfigObj users that just want config info loaded once per invocation. Is there a pythonic way of handling singleton patterns like this? Should I stick the ConfigObj loader in a separate config.py file that is loaded from each other script? Thanks! Ramon P.S. I'm not actually sure I need a singleton in the OO sense: the configuration info doesn't need to be wrapped in a class instance, but just needs a simple way to access the loaded configuration object. |
|
From: Michael F. <fuz...@vo...> - 2009-04-13 19:32:59
|
Hello all,
I've moved ConfigObj out of the pythonutils repository (pythonutils as a
project is basically dead) and into its own project on Google Code.
http://code.google.com/p/configobj/
I'm now actively working on the 4.6.0 release. Sorry for the delay.
Michael
--
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog
|
|
From: Nicola L. <ni...@te...> - 2009-04-13 19:04:21
|
Sam's Lists wrote: > ConfigParser and OptParse integrate together really well. Here's one such effort at integration: https://launchpad.net/configglue > Is there a preferred options package and a preferred way of > integrating config files and command line options with ConfigObj? Not that I know of. -- Nicola Larosa - http://www.tekNico.net/ Sidney come down, it's a beautiful night The stars shine brighter than the city lights Everything you do doesn't have to be on your own Sidney come down, it's a beautiful night you know - Erin Bode, Sidney Come Down, The Little Garden, 2008 |
|
From: Michael F. <fuz...@vo...> - 2009-04-13 18:43:52
|
Sam's Lists wrote: > > I've just started with ConfigObj, and I already like it so much better > than ConfigParser. > > One thing I do a lot of is allowing configuration options in either a > config file or on the command line. ConfigParser and OptParse > intergate together really well. Is there a preferred options package > and a preferred way of integrating config files and command line > options with ConfigObj? > Sorry for the late reply - just rediscovered this email I don't know if anyone has done the work of integrating ConfigObj with command line options, but it would certainly be an interesting project. Michael Foord > Thanks. > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------------ > Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM) > software. With Adobe AIR, Ajax developers can use existing skills and code to > build responsive, highly engaging applications that combine the power of local > resources and data with the reach of the web. Download the Adobe AIR SDK and > Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com > ------------------------------------------------------------------------ > > _______________________________________________ > Configobj-develop mailing list > Con...@li... > https://lists.sourceforge.net/lists/listinfo/configobj-develop > -- http://www.ironpythoninaction.com/ http://www.voidspace.org.uk/blog |
|
From: Michael F. <fuz...@vo...> - 2009-03-16 12:41:35
|
Hello all, The article I wrote for Python Magazine on ConfigObj is now online. It's a very good introduction to ConfigObj, but is a particularly good reference on the validation features of ConfigObj: http://www.voidspace.org.uk/python/articles/configobj.shtml This article was originally published in the May 2008 issue of the Python Magazine. Many thanks to them for allowing me to reproduce it. If you spot any typos or errors please let me know. New release coming soon... All the best, Michael Foord -- http://www.ironpythoninaction.com/ http://www.voidspace.org.uk/blog |
|
From: Michael F. <fuz...@vo...> - 2009-03-07 23:52:00
|
kat kat wrote:
>
>
> On Sat, Mar 7, 2009 at 5:41 AM, Michael Foord
> <fuz...@vo... <mailto:fuz...@vo...>> wrote:
>
> kat kat wrote:
> > Hello All,
> >
> > I need to retrieve a value of a key in the configuration file as
> a raw
> > string but somehow after ConfigObj reads it, it is escaping special
> > characters. For e.g, here is my configuration file:
> >
> > [ "constants" ]
> > 'target_dir' = r"C:\tmpdir"
> >
> > As you see above I have declared "target_dir" key's value to be
> a raw
> > string which should be evaluated literally, that is the backslash
> > present in the value should not be escaped.
>
> The raw string format is not valid ConfigObj syntax. This is what
> happens when I run your example:
>
> >>> open('cfg.txt', 'w').write("""[ "constants" ]
> ... 'target_dir' = r"C:\\tmpdir\"""")
> >>> from configobj import ConfigObj
> >>> c = ConfigObj('cfg.txt')
> >>> c['constants']['target_dir']
> 'r"C:\\tmpdir"'
> >>>
>
> See how the r is actually included in the value!
>
>
>
> Yes. I have seen that.
>
>
>
>
>
> If we remove the leading r from the string then as far as I can
> tell you
> get what you are asking for anyway?
>
> >>> open('cfg.txt', 'w').write("""[ "constants" ]
> ... 'target_dir' = "C:\\tmpdir\"""")
> >>> c = ConfigObj('cfg.txt')
> >>> c['constants']['target_dir']
> 'C:\\tmpdir'
>
> If you are asking for this: 'C:\tmpdir' then you are simply confused
> about how Python handles strings - there isn't really two
> backslashes in
> the string, there is one but it has to be escaped to be displayed.
>
>
>
> I understand that part. I know that 'C:\\tmpdir' has just one
> backslash, although since this is not a raw string you need the other
> backslash to escape the first one. See this:
>
> >>> str_a = 'C:\\tmpdir'
> >>> str_b = r'C:\tmpdir'
>
> The both are essentially same. If you print the above two:
>
> >>> print str_a
> 'C:\tmpdir'
>
> >> print str_b
> 'C:\tmpdir'
>
> As you see they both give the same output. Now see this:
>
> >>> str_c = 'C:\tmpdir'
> >> print str_c
> C: mpdir
>
> Which give the above and which is right because for python, it
> interprets \t as a tab character, which is special character, because
> "str_c" is not declared as a raw string. So I am not confused on that
> part.
>
> What I want essentially is, if we have the following in some
> configuration file:
>
> [constants]
>
> 'target_dir': r'C:\tmpdir'
>
That is not valid ConfigObj syntax. If you remove the leading r you get
what you want anyway. ConfigObj won't interpret \t as a tab character.
> then "target_dir" should be interpreted as a raw string and the module
> that is parsing this configuration file should not have a need of
> another backslash to escape the first one because its raw and should
> be interpreted literally. This works fine with ConfigParser though but
> my team ended up using ConfigObj.
>
> My point is this is a bug in ConfigObj if ConfigObj does not parse
> this right.
>
You're confusing Python syntax and ConfigObj syntax. They are different.
Michael
>
>
>
> Michael
>
> >
> > I am reading the file like this:
> >
> > >>> from configobj import ConfigObj
> > >>> config = ConfigObj("tmp.cfg")
> > >>> dir = config['constants']['target_dir']
> > >>> dir
> > 'C:\\tmpdir'
> >
> > although this is OK:
> > >>> print dir
> > 'C:\tmpdir'
> >
> > but when we do print, the string is evaluated.
> >
> > If you see, the backslash gets escaped and I no longer get the raw
> > string I had in my configuration file.
> >
> > What should I do so that ConfigObj reads that value as a raw string
> > and give me r"C:\tmpdir" instead of "C:\\tmpdir"
> >
> > Thanks much for your help
> >
> > -kk
> >
> >
> ------------------------------------------------------------------------
> >
> >
> ------------------------------------------------------------------------------
> > Open Source Business Conference (OSBC), March 24-25, 2009, San
> Francisco, CA
> > -OSBC tackles the biggest issue in open source: Open Sourcing
> the Enterprise
> > -Strategies to boost innovation and cut costs with open source
> participation
> > -Receive a $600 discount off the registration fee with the
> source code: SFAD
> > http://p.sf.net/sfu/XcvMzF8H
> >
> ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Configobj-develop mailing list
> > Con...@li...
> <mailto:Con...@li...>
> > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> >
>
>
> --
> http://www.ironpythoninaction.com/
> http://www.voidspace.org.uk/blog
>
>
>
> ------------------------------------------------------------------------------
> Open Source Business Conference (OSBC), March 24-25, 2009, San
> Francisco, CA
> -OSBC tackles the biggest issue in open source: Open Sourcing the
> Enterprise
> -Strategies to boost innovation and cut costs with open source
> participation
> -Receive a $600 discount off the registration fee with the source
> code: SFAD
> http://p.sf.net/sfu/XcvMzF8H
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> <mailto:Con...@li...>
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
>
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
> -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
> -Strategies to boost innovation and cut costs with open source participation
> -Receive a $600 discount off the registration fee with the source code: SFAD
> http://p.sf.net/sfu/XcvMzF8H
> ------------------------------------------------------------------------
>
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
--
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog
|
|
From: kat k. <dok...@gm...> - 2009-03-07 20:10:39
|
On Sat, Mar 7, 2009 at 5:41 AM, Michael Foord <fuz...@vo...>wrote:
> kat kat wrote:
> > Hello All,
> >
> > I need to retrieve a value of a key in the configuration file as a raw
> > string but somehow after ConfigObj reads it, it is escaping special
> > characters. For e.g, here is my configuration file:
> >
> > [ "constants" ]
> > 'target_dir' = r"C:\tmpdir"
> >
> > As you see above I have declared "target_dir" key's value to be a raw
> > string which should be evaluated literally, that is the backslash
> > present in the value should not be escaped.
>
> The raw string format is not valid ConfigObj syntax. This is what
> happens when I run your example:
>
> >>> open('cfg.txt', 'w').write("""[ "constants" ]
> ... 'target_dir' = r"C:\\tmpdir\"""")
> >>> from configobj import ConfigObj
> >>> c = ConfigObj('cfg.txt')
> >>> c['constants']['target_dir']
> 'r"C:\\tmpdir"'
> >>>
>
> See how the r is actually included in the value!
Yes. I have seen that.
>
>
> If we remove the leading r from the string then as far as I can tell you
> get what you are asking for anyway?
>
> >>> open('cfg.txt', 'w').write("""[ "constants" ]
> ... 'target_dir' = "C:\\tmpdir\"""")
> >>> c = ConfigObj('cfg.txt')
> >>> c['constants']['target_dir']
> 'C:\\tmpdir'
>
> If you are asking for this: 'C:\tmpdir' then you are simply confused
> about how Python handles strings - there isn't really two backslashes in
> the string, there is one but it has to be escaped to be displayed.
I understand that part. I know that 'C:\\tmpdir' has just one backslash,
although since this is not a raw string you need the other backslash to
escape the first one. See this:
>>> str_a = 'C:\\tmpdir'
>>> str_b = r'C:\tmpdir'
The both are essentially same. If you print the above two:
>>> print str_a
'C:\tmpdir'
>> print str_b
'C:\tmpdir'
As you see they both give the same output. Now see this:
>>> str_c = 'C:\tmpdir'
>> print str_c
C: mpdir
Which give the above and which is right because for python, it interprets \t
as a tab character, which is special character, because "str_c" is not
declared as a raw string. So I am not confused on that part.
What I want essentially is, if we have the following in some configuration
file:
[constants]
'target_dir': r'C:\tmpdir'
then "target_dir" should be interpreted as a raw string and the module that
is parsing this configuration file should not have a need of another
backslash to escape the first one because its raw and should be interpreted
literally. This works fine with ConfigParser though but my team ended up
using ConfigObj.
My point is this is a bug in ConfigObj if ConfigObj does not parse this
right.
>
> Michael
>
> >
> > I am reading the file like this:
> >
> > >>> from configobj import ConfigObj
> > >>> config = ConfigObj("tmp.cfg")
> > >>> dir = config['constants']['target_dir']
> > >>> dir
> > 'C:\\tmpdir'
> >
> > although this is OK:
> > >>> print dir
> > 'C:\tmpdir'
> >
> > but when we do print, the string is evaluated.
> >
> > If you see, the backslash gets escaped and I no longer get the raw
> > string I had in my configuration file.
> >
> > What should I do so that ConfigObj reads that value as a raw string
> > and give me r"C:\tmpdir" instead of "C:\\tmpdir"
> >
> > Thanks much for your help
> >
> > -kk
> >
> > ------------------------------------------------------------------------
> >
> >
> ------------------------------------------------------------------------------
> > Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco,
> CA
> > -OSBC tackles the biggest issue in open source: Open Sourcing the
> Enterprise
> > -Strategies to boost innovation and cut costs with open source
> participation
> > -Receive a $600 discount off the registration fee with the source code:
> SFAD
> > http://p.sf.net/sfu/XcvMzF8H
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Configobj-develop mailing list
> > Con...@li...
> > https://lists.sourceforge.net/lists/listinfo/configobj-develop
> >
>
>
> --
> http://www.ironpythoninaction.com/
> http://www.voidspace.org.uk/blog
>
>
>
>
> ------------------------------------------------------------------------------
> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco,
> CA
> -OSBC tackles the biggest issue in open source: Open Sourcing the
> Enterprise
> -Strategies to boost innovation and cut costs with open source
> participation
> -Receive a $600 discount off the registration fee with the source code:
> SFAD
> http://p.sf.net/sfu/XcvMzF8H
> _______________________________________________
> Configobj-develop mailing list
> Con...@li...
> https://lists.sourceforge.net/lists/listinfo/configobj-develop
>
|