liteconfig
Lightweight and configurable .ini config parser with dot notation property access.
Features
-
dot notation:
value = cfg.section.property; -
customizable parsing options;
-
no dependencies inside, only plain Python;
-
can handle text files, multiline strings or lists as input data;
-
no singleton, you can use as much Config objects as you want;
-
multiple encodings support, including Unicode;
-
read/write config files.
Default parsing options and their meaning
-
delimiter = '='
delimiter between property and value is "=". -
before_delimiter = ' ' -
after_delimiter = ' '
strings which will precede and follow up delimiter character when exporting config to file. For example, propertyiwith value of0will be exported asi = 0. And ifbefore_delimiterwill be set as:, the same thing will be exported asi := 0. -
comment_markers = '#;'
empty lines and lines beginning with "#" or ";" are ignored. -
parse_numbers = True
will try to parse numeric values to int or float. -
parse_booleans = True
will try to parse boolean values to bool. -
boolean_true = ('yes', 'true', 'on')
case-insensitive tuple of string values, recognized as boolean "True". -
boolean_false = ('no', 'false', 'off')
case-insensitive tuple of string values, recognized as boolean "False". -
encoding = 'utf-8'
parser will try to read and write config files using this encoding. -
exceptions = False
If True, accessing nonexistent properties (or sections) of config will raiseAttributeError. If False, nonexistent property will return None. Absent section will return special object Nothing, which can be tested against truth (and it will always return False). So you can use the construction like
if cfg.section.property:
# do something with cfg.section.property
else:
# handle nonexistence
Public methods of Config object
-
__init__(input_data [, delimiter, comment_markers, parse_numbers, parse_booleans, boolean_true, boolean_false, encoding, exceptions])
Instantiates Config object and parses input_data. Depending on type of input_data, instance will parse it as list, as multiline string or will interpret string as path to config file and read it. -
has_section(item)
Return True or False depending on existence of config section. -
has_property(item [, section])
Return True or False depending on existence of config property. Will search in all sections by default or in one concrete section if it is passed as second argument. -
write(file)
Export config to file with the same settings as when object was instantiated.
Error handling
-
Attempt to load nonexistent config file will raise
FileNotFoundError. -
Also may raise
PermissionErrorif process does not have sufficient privileges to read or write file. -
If desired, access to nonexistent property (or section) will raise
AttributeError. -
If
input_datais not list nor string nor path to config file, will raiseValueError. -
Fail to decode
input_datafile will result inUnicodeError.
Notes
- When exporting config, boolean values will always be written like
TrueorFalse, regardless of initial readings (yes,no,on,offet cetera).
Example
===BEGIN config.ini===
; liteconfig support very simple sectionless configs too
property = value
[section]
; this comment will be ignored
heads=tails
truth = lie
nokia = 3310
[misc]
# this comment will be ignored too
kill_all_humans = yes
pi = 3.14159
[юникод]
文字 = 😉
===END config.ini===
Here we have: comments and empty lines, three sections and one "free" item. Some sections are named using ASCII symbols and one is Unicode. Also notice heads=tails key-value: it isn't necessary to have spaces before and after delimiter. Property and values can also be Unicode: cyrillic, hieroglyphs and emoji are welcome, thanks to Python3.
Default behaviour is to try to represent all numbers as ints and floats, not strings. The same goes to boolean values: notice how yes became True for kill_all_humans property.
import liteconfig
cfg = liteconfig.Config('config.ini')
print(cfg.property) # 'value'
print(cfg.section.heads) # 'tails'
print(cfg.юникод.文字) # '😉'
print(cfg.section.nokia) # 3310
print(type(cfg.section.nokia)) # int
print(cfg.misc.kill_all_humans) # True
print(type(cfg.misc.kill_all_humans)) # bool
print(cfg.misc.pi) # 3.14159
print(type(cfg.misc.pi)) # float
print(cfg.nonexistent) # AttributeError exception or None
print(cfg.voidsection.nonexistent) # AttributeError exception or Nothing (boolean False)
print(cfg.voidsection) # AttributeError exception or Nothing (boolean False)
TO-DO
-
Parsers for various formats of hierarchical configs (with subsections).
-
Support for versions of Python lesser than 3.6 (probably).
History
-
0.0.1: initial release.
-
0.0.2: added option to raise exception or return None/False for absent properties or sections.
-
0.0.3: minor fixes in documentation.
-
0.1.0: added tests. Removed '1' and '0' from parsed booleans, as it conflicts with parsing numbers.
-
0.1.1: minor fixes in documentation.
-
0.1.2: code clean-up.
-
1.0.0: bug-fixing. Tests re-written using pytest. Also, liteconfig learned how to keep comments when writing previously read config.
Metadata
Release files for liteconfig 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| liteconfig-1.0.0.tar.gz | 7.8 kB | Without provenance | Details |
Release files / liteconfig-1.0.0.tar.gz
| Download URL | liteconfig-1.0.0.tar.gz |
|---|---|
| Size | 7.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
98e94771adf411a2f67a794794a9a2a82ac04a36400aea92fb98c751a773c06a
|
|
BLAKE2b-256 checksum How to use checksums |
5f2684f44b74703817dcdc3c2893722e4773ceab97fe6e832bcafb80ccedfbad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.5
|
Security for liteconfig 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.