Skip to content

Commit ad73068

Browse files
authored
Merge pull request #1 from aoamusat:feature-parse-config-values
Feature-parse-config-values
2 parents 05ff98b + 9bb2ce5 commit ad73068

File tree

4 files changed

+47
-33
lines changed

4 files changed

+47
-33
lines changed

iniutil/parser.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,28 @@
1-
from typing import Generator, Dict
1+
from typing import Generator, Dict, Any
2+
3+
4+
def cast_config_value(value: str) -> Any:
5+
"""Cast the given config value to appropriate type
6+
7+
Args:
8+
value (Any): config value to cast
9+
10+
Returns:
11+
Any: casted value
12+
"""
13+
14+
BOOLEAN_VALUES = ["true", "false"]
15+
16+
if value.lower() in BOOLEAN_VALUES:
17+
return True if value.lower() == "true" else False
18+
try:
19+
return int(value)
20+
except ValueError:
21+
try:
22+
return float(value)
23+
except ValueError:
24+
return value
25+
226

327
def read_ini(path: str) -> Generator:
428
"""Read ini configuration file
@@ -44,13 +68,9 @@ def parse_ini(path: str) -> Dict[str, Dict[str, str]]:
4468
key, val = line.split("=", 1)
4569

4670
if current_section is not None:
47-
config[current_section][key.strip()] = val.strip()
71+
config[current_section][key.strip()] = cast_config_value(val.strip())
4872
continue
4973
else:
50-
config[key.strip()] = val.strip()
74+
config[key.strip()] = cast_config_value(val.strip())
5175
current_section = None
5276
return config
53-
54-
if __name__ == "__main__":
55-
print(parse_ini("samples/sample.ini"))
56-
print(parse_ini("samples/generic.ini"))
File renamed without changes.
File renamed without changes.

tests/test_parser.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import unittest
2-
from iniutil.parser import parse_ini
2+
from iniutil.parser import cast_config_value, parse_ini
33

44

5-
class Test(unittest.TestCase):
6-
def setUp(self):
7-
# Set up paths relative to the test script
8-
self.sample_ini_path = "resources/sample.ini"
9-
self.generic_ini_path = "resources/generic.ini"
5+
class ParserTest(unittest.TestCase):
6+
@classmethod
7+
def setUpClass(cls) -> None:
8+
cls.test_file_path = "resources/sample.ini"
109

11-
def test_example_case(self):
12-
"""example case"""
10+
@classmethod
11+
def tearDownClass(cls) -> None:
12+
del cls.test_file_path
13+
14+
def test_ini_parser(self):
1315
expected = {
1416
"owner": {
1517
"name": "John Doe",
@@ -24,25 +26,17 @@ def test_example_case(self):
2426
"connection": "",
2527
},
2628
}
27-
actual = parse_ini(self.sample_ini_path)
28-
self.assertEqual(actual, expected)
29+
self.assertEqual(expected, parse_ini(self.test_file_path))
2930

30-
def test_generic_case(self):
31-
"""generic case"""
32-
expected = {
33-
"section": {
34-
"b": False,
35-
"f": 206.201,
36-
"i": -55,
37-
"i1": 1,
38-
"b1": True,
39-
"b2": False,
40-
"s": "",
41-
},
42-
}
43-
actual = parse_ini(self.generic_ini_path)
44-
self.assertEqual(actual, expected)
31+
def test_value_cast(self):
32+
self.assertEqual(
33+
cast_config_value("https://api.example.com"), "https://api.example.com"
34+
)
35+
self.assertEqual(cast_config_value("3306"), 3306)
36+
self.assertEqual(cast_config_value("false"), False)
37+
self.assertEqual(cast_config_value("true"), True)
38+
self.assertEqual(cast_config_value("9.5"), 9.5)
4539

4640

4741
if __name__ == "__main__":
48-
unittest.main()
42+
unittest.main()

0 commit comments

Comments
 (0)