Security News
Fluent Assertions Faces Backlash After Abandoning Open Source Licensing
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
libconf is a pure-Python reader/writer for configuration files in libconfig format
, which is often used in C/C++ projects. It's interface is similar to
the json
module: the four main methods are load()
, loads()
,
dump()
, and dumps()
.
Example usage::
import io, libconf
>>> with io.open('example.cfg') as f:
... config = libconf.load(f)
>>> config
{'capabilities': {'can-do-arrays': [3, 'yes', True],
'can-do-lists': (True,
14880,
('sublist',),
{'subgroup': 'ok'})},
'version': 7,
'window': {'position': {'h': 600, 'w': 800, 'x': 375, 'y': 210},
'title': 'libconfig example'}}
>>> config['window']['title']
'libconfig example'
>>> config.window.title
'libconfig example'
>>> print(libconf.dumps({'size': [10, 15], 'flag': True}))
flag = True;
size =
[
10,
15
];
The data can be accessed either via indexing (['title']
) or via attribute
access .title
.
The recommended way to use libconf is with Unicode objects (unicode
on
Python2, str
on Python3). Input strings or streams for load()
and
loads()
should be Unicode, as should be all strings contained in data
structures passed to dump()
and dumps()
.
In load()
and loads()
, escape sequences (such as \n
, \r
,
\t
, or \xNN
) are decoded. Hex escapes (\xNN
) are mapped to Unicode
characters U+0000 through U+00FF. All other characters are passed though as-is.
In dump()
and dumps()
, unprintable characters below U+0080 are escaped
as \n
, \r
, \t
, \f
, or \xNN
sequences. Characters U+0080
and above are passed through as-is.
Reading libconfig files is easy. Writing is made harder by two factors:
int and int64
_: 2
vs. 2L
lists
_ and arrays
_, and
the limitations on arraysThe first point concerns writing Python int
values. Libconf dumps values
that fit within the C/C++ 32bit int
range without an "L" suffix. For larger
values, an "L" suffix is automatically added. To force the addition of an "L"
suffix even for numbers within the 32 bit integer range, wrap the integer in a
LibconfInt64
class.
Examples::
dumps({'value': 2}) # Returns "value = 2;"
dumps({'value': 2**32}) # Returns "value = 4294967296L;"
dumps({'value': LibconfInt64(2)}) # Explicit int64, returns "value = 2L;"
The second complication arises from distinction between lists
_ and arrays
_
in the libconfig language. Lists are enclosed by ()
parenthesis, and can
contain arbitrary values within them. Arrays are enclosed by []
brackets,
and have significant limitations: all values must be scalar (int, float, bool,
string) and must be of the same type.
Libconf uses the following convention:
()
-lists to Python tuples, which also use the ()
syntax.[]
-arrays to Python lists, which also use the []
syntax.This provides nice symmetry between the two languages, but has the drawback
that dumping Python lists inherits the limitations of libconfig's arrays.
To explicitly control whether lists or arrays are dumped, wrap the Python
list/tuple in a LibconfList
or LibconfArray
.
Examples::
# Libconfig lists (=Python tuples) can contain arbitrary complex types:
dumps({'libconf_list': (1, True, {})})
# Libconfig arrays (=Python lists) must contain scalars of the same type:
dumps({'libconf_array': [1, 2, 3]})
# Equivalent, but more explit by using LibconfList/LibconfArray:
dumps({'libconf_list': LibconfList([1, True, {}])})
dumps({'libconf_array': LibconfArray([1, 2, 3])})
Pylibconfig2
_ is another pure-Python libconfig reader. It's API
is based on the C++ interface, instead of the Python json
_ module.
It's licensed under GPLv3, which makes it unsuitable for use in a large number
of projects.
Python-libconfig
_ is a library that provides Python bindings for the
libconfig++ C++ library. While permissively licensed (BSD), it requires a
compilation step upon installation, which can be a drawback.
I wrote libconf (this library) because both of the existing libraries didn't fit my requirements. I had a work-related project which is not open source (ruling out pylibconfig2) and I didn't want the deployment headache of python-libconfig. Further, I enjoy writing parsers and this seemed like a nice opportunity :-)
2.0.1, released on 2019-11-21
2.0.0, released on 2018-11-23
dump()
and dumps()
: raise an exception when
dumping data that can not be read by the C libconfig implementation.
This change may raise exceptions on code that worked with <2.0.0!LibconfList
, LibconfArray
, LibconfInt64
classes for
more fine-grained control of the dump()
/dumps()
output.deepcopy()
of AttrDict
classes (thanks AnandTella).1.0.1, released on 2017-01-06
1.0.0, released on 2016-10-26:
dump()
and dumps()
,
thanks clarkli86 and eatsan)0.9.2, released on 2016-09-09:
.. _libconfig format: http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files .. _json: https://docs.python.org/3/library/json.html .. _lists: https://hyperrealm.github.io/libconfig/libconfig_manual.html#Lists .. _arrays: https://hyperrealm.github.io/libconfig/libconfig_manual.html#Arrays .. _int and int64: https://hyperrealm.github.io/libconfig/libconfig_manual.html#g_t64_002dbit-Integer-Values .. _Pylibconfig2: https://github.com/heinzK1X/pylibconfig2 .. _Python-libconfig: https://github.com/cnangel/python-libconfig
FAQs
A pure-Python libconfig reader/writer with permissive license
We found that libconf demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.