Squashed 'kiauh/core/submodules/simple_config_parser/' content from commit 90081a6

git-subtree-dir: kiauh/core/submodules/simple_config_parser
git-subtree-split: 90081a6539ec38adf6a1a5bb707a0e9934567c7f
This commit is contained in:
dw-0
2024-09-24 19:22:13 +02:00
commit 2f924a2550
46 changed files with 4056 additions and 0 deletions

View File

View File

@@ -0,0 +1,26 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
from pathlib import Path
import pytest
from src.simple_config_parser.simple_config_parser import SimpleConfigParser
from tests.utils import load_testdata_from_file
BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
CONFIG_FILES = ["test_config_1.cfg", "test_config_2.cfg", "test_config_3.cfg"]
@pytest.fixture(params=CONFIG_FILES)
def parser(request):
parser = SimpleConfigParser()
file_path = BASE_DIR.joinpath(request.param)
for line in load_testdata_from_file(file_path):
parser._parse_line(line) # noqa
return parser

View File

@@ -0,0 +1,174 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
import pytest
from src.simple_config_parser.simple_config_parser import (
NoOptionError,
NoSectionError,
)
def test_get_options(parser):
expected_options = {
"section_1": {"option_1"},
"section_2": {"option_2"},
"section_3": {"option_3"},
"section_4": {"option_4"},
"section number 5": {"option_5", "multi_option", "option_5_1"},
}
for section, options in expected_options.items():
assert options.issubset(
parser.get_options(section)
), f"Expected options: {options} in section: {section}, got: {parser.get_options(section)}"
assert "_raw" not in parser.get_options(section)
assert all(
not option.startswith("#_") for option in parser.get_options(section)
)
def test_has_option(parser):
assert parser.has_option("section_1", "option_1") is True
assert parser.has_option("section_1", "option_128") is False
# section does not exist:
assert parser.has_option("section_128", "option_1") is False
def test_getval(parser):
# test regular option values
assert parser.getval("section_1", "option_1") == "value_1"
assert parser.getval("section_3", "option_3") == "value_3"
assert parser.getval("section_4", "option_4") == "value_4"
assert parser.getval("section number 5", "option_5") == "this.is.value-5"
assert parser.getval("section number 5", "option_5_1") == "value_5_1"
assert parser.getval("section_2", "option_2") == "value_2"
# test multiline option values
ml_val = parser.getval("section number 5", "multi_option")
assert isinstance(ml_val, list)
assert len(ml_val) > 0
def test_getval_fallback(parser):
assert parser.getval("section_1", "option_128", "fallback") == "fallback"
def test_getval_exceptions(parser):
with pytest.raises(NoSectionError):
parser.getval("section_128", "option_1")
with pytest.raises(NoOptionError):
parser.getval("section_1", "option_128")
def test_getint(parser):
value = parser.getint("section_1", "option_1_2")
assert isinstance(value, int)
def test_getint_from_val(parser):
with pytest.raises(ValueError):
parser.getint("section_1", "option_1")
def test_getint_from_float(parser):
with pytest.raises(ValueError):
parser.getint("section_1", "option_1_3")
def test_getint_from_boolean(parser):
with pytest.raises(ValueError):
parser.getint("section_1", "option_1_1")
def test_getint_fallback(parser):
assert parser.getint("section_1", "option_128", 128) == 128
def test_getboolean(parser):
value = parser.getboolean("section_1", "option_1_1")
assert isinstance(value, bool)
assert value is True or value is False
def test_getboolean_from_val(parser):
with pytest.raises(ValueError):
parser.getboolean("section_1", "option_1")
def test_getboolean_from_int(parser):
with pytest.raises(ValueError):
parser.getboolean("section_1", "option_1_2")
def test_getboolean_from_float(parser):
with pytest.raises(ValueError):
parser.getboolean("section_1", "option_1_3")
def test_getboolean_fallback(parser):
assert parser.getboolean("section_1", "option_128", True) is True
assert parser.getboolean("section_1", "option_128", False) is False
def test_getfloat(parser):
value = parser.getfloat("section_1", "option_1_3")
assert isinstance(value, float)
def test_getfloat_from_val(parser):
with pytest.raises(ValueError):
parser.getfloat("section_1", "option_1")
def test_getfloat_from_int(parser):
value = parser.getfloat("section_1", "option_1_2")
assert isinstance(value, float)
def test_getfloat_from_boolean(parser):
with pytest.raises(ValueError):
parser.getfloat("section_1", "option_1_1")
def test_getfloat_fallback(parser):
assert parser.getfloat("section_1", "option_128", 1.234) == 1.234
def test_set_existing_option(parser):
parser.set_option("section_1", "new_option", "new_value")
assert parser.getval("section_1", "new_option") == "new_value"
assert parser.config["section_1"]["new_option"]["_raw"] == "new_option: new_value\n"
parser.set_option("section_1", "new_option", "new_value_2")
assert parser.getval("section_1", "new_option") == "new_value_2"
assert (
parser.config["section_1"]["new_option"]["_raw"] == "new_option: new_value_2\n"
)
def test_set_new_option(parser):
parser.set_option("new_section", "very_new_option", "very_new_value")
assert (
parser.has_section("new_section") is True
), f"Expected 'new_section' in {parser.get_sections()}"
assert parser.getval("new_section", "very_new_option") == "very_new_value"
parser.set_option("section_2", "array_option", ["value_1", "value_2", "value_3"])
assert parser.getval("section_2", "array_option") == [
"value_1",
"value_2",
"value_3",
]
assert parser.config["section_2"]["array_option"]["_raw"] == "array_option:\n"
def test_remove_option(parser):
parser.remove_option("section_1", "option_1")
assert parser.has_option("section_1", "option_1") is False

View File

@@ -0,0 +1,22 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
from pathlib import Path
from src.simple_config_parser.simple_config_parser import (
SimpleConfigParser,
)
BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
TEST_DATA_PATH = BASE_DIR.joinpath("test_config_1.cfg")
def test_read_file():
parser = SimpleConfigParser()
parser.read_file(TEST_DATA_PATH)
assert parser.config is not None
assert parser.config.keys() is not None

View File

@@ -0,0 +1,66 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
import pytest
from src.simple_config_parser.simple_config_parser import (
DuplicateSectionError,
)
def test_get_sections(parser):
expected_keys = {
"section_1",
"section_2",
"section_3",
"section_4",
"section number 5",
}
assert expected_keys.issubset(
parser.get_sections()
), f"Expected keys: {expected_keys}, got: {parser.get_sections()}"
def test_has_section(parser):
assert parser.has_section("section_1") is True
assert parser.has_section("not_available") is False
def test_add_section(parser):
pre_add_count = len(parser.get_sections())
parser.add_section("new_section")
parser.add_section("new_section2")
assert parser.has_section("new_section") is True
assert parser.has_section("new_section2") is True
assert len(parser.get_sections()) == pre_add_count + 2
new_section = parser.config["new_section"]
assert isinstance(new_section, dict)
assert new_section["_raw"] == "[new_section]\n"
# this should be the collector, added by the parser before
# then second section was added
assert list(new_section.keys())[-1].startswith("#_")
assert "\n" in new_section[list(new_section.keys())[-1]]
new_section2 = parser.config["new_section2"]
assert isinstance(new_section2, dict)
assert new_section2["_raw"] == "[new_section2]\n"
def test_add_section_duplicate(parser):
with pytest.raises(DuplicateSectionError):
parser.add_section("section_1")
def test_remove_section(parser):
pre_remove_count = len(parser.get_sections())
parser.remove_section("section_1")
assert parser.has_section("section_1") is False
assert len(parser.get_sections()) == pre_remove_count - 1
assert "section_1" not in parser.config

View File

@@ -0,0 +1,41 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
from pathlib import Path
import pytest
from src.simple_config_parser.simple_config_parser import (
SimpleConfigParser,
)
BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
TEST_DATA_PATH = BASE_DIR.joinpath("test_config_1.cfg")
# TEST_DATA_PATH_2 = BASE_DIR.joinpath("test_config_1_write.cfg")
def test_write_file_exception():
parser = SimpleConfigParser()
with pytest.raises(ValueError):
parser.write_file(None) # noqa
def test_write_to_file(tmp_path):
tmp_file = Path(tmp_path).joinpath("tmp_config.cfg")
parser1 = SimpleConfigParser()
parser1.read_file(TEST_DATA_PATH)
# parser1.write_file(TEST_DATA_PATH_2)
parser1.write_file(tmp_file)
parser2 = SimpleConfigParser()
parser2.read_file(tmp_file)
assert tmp_file.exists()
assert parser2.config is not None
with open(TEST_DATA_PATH, "r") as original, open(tmp_file, "r") as written:
assert original.read() == written.read()