Add config parser functionality
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
This commit is contained in:
1
tests/_support_data/config/empty.cfg
Normal file
1
tests/_support_data/config/empty.cfg
Normal file
@@ -0,0 +1 @@
|
||||
# empty file with no directives
|
||||
20
tests/_support_data/config/invalid.cfg
Normal file
20
tests/_support_data/config/invalid.cfg
Normal file
@@ -0,0 +1,20 @@
|
||||
# cloner.cfg
|
||||
# main config
|
||||
# created at 2018-03-23 20:24:57
|
||||
invalid_option1
|
||||
invalid_option=2
|
||||
|
||||
# main url - url of main repo - just to clone
|
||||
cloner_repo_url=git@git.somerandomserver.test:/path
|
||||
|
||||
# project name (names of volumes are derrived from this
|
||||
cloner_project_name=some-random-project
|
||||
|
||||
# cloner interval (in minutes, default=0 - run always)
|
||||
cloner_interval=666
|
||||
|
||||
# do you need submodules support? (1/0)
|
||||
cloner_submodules=1
|
||||
|
||||
# max depth of submodule scan (default = unlimited, uncomment to use)
|
||||
cloner_submodule_depth=500000
|
||||
18
tests/_support_data/config/valid.cfg
Normal file
18
tests/_support_data/config/valid.cfg
Normal file
@@ -0,0 +1,18 @@
|
||||
# cloner.cfg
|
||||
# main config
|
||||
# created at 2018-03-23 20:24:57
|
||||
|
||||
# main url - url of main repo - just to clone
|
||||
cloner_repo_url=git@git.somerandomserver.test:/path
|
||||
|
||||
# project name (names of volumes are derrived from this
|
||||
cloner_project_name=some-random-project
|
||||
|
||||
# cloner interval (in minutes, default=0 - run always)
|
||||
cloner_interval=666
|
||||
|
||||
# do you need submodules support? (1/0)
|
||||
cloner_submodules=1
|
||||
|
||||
# max depth of submodule scan (default = unlimited, uncomment to use)
|
||||
cloner_submodule_depth=500000
|
||||
@@ -66,7 +66,7 @@ def test_set_property():
|
||||
# invalid type
|
||||
with pytest.raises(ValueError) as exc:
|
||||
x._set_property("cloner_interval", "č")
|
||||
assert exc.exconly() == "ValueError: Invalid value for key cloner_interval: type is <class 'str'>"
|
||||
assert exc.exconly() == "ValueError: Invalid value for key cloner_interval: type is <class 'str'> instead of <class 'int'>, conversion failed"
|
||||
|
||||
x._set_property("cloner_project_name", "č")
|
||||
|
||||
@@ -74,3 +74,15 @@ def test_set_property():
|
||||
with pytest.raises(KeyError) as exc:
|
||||
x._set_property("nonexistent_key", 888)
|
||||
assert exc.exconly() == "KeyError: 'nonexistent_key is not recognized config option'"
|
||||
|
||||
# boolean conversion
|
||||
x._set_property("cloner_submodules", "1")
|
||||
assert x.cloner_submodules == True
|
||||
|
||||
x._set_property("cloner_submodules", "0")
|
||||
assert x.cloner_submodules == False
|
||||
|
||||
# integer conversion
|
||||
x._set_property("cloner_interval", 60)
|
||||
assert x.cloner_interval == 60
|
||||
|
||||
|
||||
72
tests/lib/test_cloner_config_parser.py
Normal file
72
tests/lib/test_cloner_config_parser.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from repo_cloner.lib.cloner_config import ClonerConfigParser
|
||||
import pytest
|
||||
from repo_cloner.lib.config_file_not_found_error import ConfigFileNotFoundError
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def config_path() -> Path:
|
||||
path = Path(__file__).parent.parent
|
||||
return path.joinpath("_support_data", "config")
|
||||
|
||||
|
||||
def test_no_config_file():
|
||||
with pytest.raises(ConfigFileNotFoundError) as e:
|
||||
x = ClonerConfigParser("/tmp/path/that/does/not/exist")
|
||||
assert e.__str__() == "<ExceptionInfo ConfigFileNotFoundError('/tmp/path/that/does/not/exist') tblen=2>"
|
||||
|
||||
|
||||
def test_valid_config(config_path: Path):
|
||||
cfg = config_path.joinpath("valid.cfg")
|
||||
x = ClonerConfigParser(cfg)
|
||||
assert x.invalid == False
|
||||
assert x.invalid_lines == []
|
||||
c = x.config
|
||||
assert c.cloner_project_name == "some-random-project"
|
||||
assert c.cloner_repo_url == "git@git.somerandomserver.test:/path"
|
||||
assert c.cloner_interval == 666
|
||||
assert c.cloner_submodules == True
|
||||
assert c.cloner_submodule_depth == 500000
|
||||
|
||||
|
||||
def test_empty_config(config_path: Path):
|
||||
cfg = config_path.joinpath("empty.cfg")
|
||||
x = ClonerConfigParser(cfg)
|
||||
assert x.invalid == False
|
||||
assert x.invalid_lines == []
|
||||
c = x.config
|
||||
assert c.cloner_project_name == ""
|
||||
assert c.cloner_repo_url == ""
|
||||
assert c.cloner_interval == 5
|
||||
assert c.cloner_submodules == True
|
||||
assert c.cloner_submodule_depth == 50000
|
||||
|
||||
|
||||
def test_invalid_config(config_path: Path, caplog):
|
||||
cfg = config_path.joinpath("invalid.cfg")
|
||||
with caplog.at_level(30):
|
||||
x = ClonerConfigParser(cfg)
|
||||
|
||||
# two invalid lines
|
||||
assert x.invalid == True
|
||||
assert x.invalid_lines == [
|
||||
('invalid_option1', None),
|
||||
('invalid_option', "2"),
|
||||
]
|
||||
# test logging
|
||||
assert any(
|
||||
(r.levelname == "CRITICAL" and r.message == "'invalid_option is not recognized config option'")
|
||||
for r in caplog.records
|
||||
)
|
||||
|
||||
assert any(
|
||||
(r.levelname == "WARNING" and r.message == "Line 'invalid_option1' has invalid format!")
|
||||
for r in caplog.records
|
||||
)
|
||||
|
||||
c = x.config
|
||||
assert c.cloner_project_name == "some-random-project"
|
||||
assert c.cloner_repo_url == "git@git.somerandomserver.test:/path"
|
||||
assert c.cloner_interval == 666
|
||||
assert c.cloner_submodules == True
|
||||
assert c.cloner_submodule_depth == 500000
|
||||
@@ -102,3 +102,25 @@ def test_has_config(tmp_path: PosixPath):
|
||||
|
||||
tmp_path.joinpath("config", "cloner.cfg").touch()
|
||||
assert X.has_config
|
||||
|
||||
|
||||
def test_config_file(tmp_path: PosixPath):
|
||||
X = RepoDirStructure(tmp_path)
|
||||
assert X.config_file == tmp_path.joinpath("config", "cloner.cfg").__str__()
|
||||
|
||||
|
||||
def test_get_config(tmp_path: PosixPath):
|
||||
tmp_path.joinpath("config").mkdir()
|
||||
tmp_path.joinpath("cache").mkdir()
|
||||
tmp_path.joinpath("repos").mkdir()
|
||||
|
||||
X = RepoDirStructure(tmp_path)
|
||||
# no file provided
|
||||
with pytest.raises(ConfigFileNotFoundError) as excinfo:
|
||||
X.config
|
||||
|
||||
# create config file
|
||||
tmp_path.joinpath("config", "cloner.cfg").touch()
|
||||
X = RepoDirStructure(tmp_path)
|
||||
assert X.has_config == True
|
||||
assert 5 == X.config.cloner_interval
|
||||
|
||||
Reference in New Issue
Block a user