summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Wittig <max.wittig@siemens.com>2018-11-04 16:52:32 +0100
committerGauvain Pocentek <gauvainpocentek@gmail.com>2018-11-04 16:52:32 +0100
commit6ad9da04496f040ae7d95701422434bc935a5a80 (patch)
tree55020c49fbf3c8519efff6a45b6a4f2cfa93e496
parent742243f4f43042d4b561e3875dc38e560bb71624 (diff)
downloadgitlab-6ad9da04496f040ae7d95701422434bc935a5a80.tar.gz
fix(cli): exit on config parse error, instead of crashing
* Exit and hint user about possible errors * test: adjust test cases to config missing error
-rw-r--r--gitlab/cli.py11
-rw-r--r--gitlab/config.py17
-rw-r--r--gitlab/tests/test_config.py20
3 files changed, 42 insertions, 6 deletions
diff --git a/gitlab/cli.py b/gitlab/cli.py
index e79ac6d..17917f5 100644
--- a/gitlab/cli.py
+++ b/gitlab/cli.py
@@ -17,6 +17,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
+
import argparse
import functools
import importlib
@@ -143,9 +144,13 @@ def main():
# load the propermodule (v3 or v4) accordingly. At that point we don't have
# any subparser setup
(options, args) = parser.parse_known_args(sys.argv)
-
- config = gitlab.config.GitlabConfigParser(options.gitlab,
- options.config_file)
+ try:
+ config = gitlab.config.GitlabConfigParser(
+ options.gitlab,
+ options.config_file
+ )
+ except gitlab.config.ConfigError as e:
+ sys.exit(e)
cli_module = importlib.import_module('gitlab.v%s.cli' % config.api_version)
# Now we build the entire set of subcommands and do the complete parsing
diff --git a/gitlab/config.py b/gitlab/config.py
index 9f4c11d..1c76594 100644
--- a/gitlab/config.py
+++ b/gitlab/config.py
@@ -37,10 +37,27 @@ class GitlabDataError(ConfigError):
pass
+class GitlabConfigMissingError(ConfigError):
+ pass
+
+
class GitlabConfigParser(object):
def __init__(self, gitlab_id=None, config_files=None):
self.gitlab_id = gitlab_id
_files = config_files or _DEFAULT_FILES
+ file_exist = False
+ for file in _files:
+ if os.path.exists(file):
+ file_exist = True
+ if not file_exist:
+ raise GitlabConfigMissingError(
+ "Config file not found. \nPlease create one in "
+ "one of the following locations: {} \nor "
+ "specify a config file using the '-c' parameter.".format(
+ ", ".join(_DEFAULT_FILES)
+ )
+ )
+
self._config = configparser.ConfigParser()
self._config.read(_files)
diff --git a/gitlab/tests/test_config.py b/gitlab/tests/test_config.py
index 0b585e8..d1e668e 100644
--- a/gitlab/tests/test_config.py
+++ b/gitlab/tests/test_config.py
@@ -76,11 +76,20 @@ per_page = 200
class TestConfigParser(unittest.TestCase):
+ @mock.patch('os.path.exists')
+ def test_missing_config(self, path_exists):
+ path_exists.return_value = False
+ with self.assertRaises(config.GitlabConfigMissingError):
+ config.GitlabConfigParser('test')
+
+ @mock.patch('os.path.exists')
@mock.patch('six.moves.builtins.open')
- def test_invalid_id(self, m_open):
+ def test_invalid_id(self, m_open, path_exists):
fd = six.StringIO(no_default_config)
fd.close = mock.Mock(return_value=None)
m_open.return_value = fd
+ path_exists.return_value = True
+ config.GitlabConfigParser('there')
self.assertRaises(config.GitlabIDError, config.GitlabConfigParser)
fd = six.StringIO(valid_config)
@@ -90,12 +99,15 @@ class TestConfigParser(unittest.TestCase):
config.GitlabConfigParser,
gitlab_id='not_there')
+ @mock.patch('os.path.exists')
@mock.patch('six.moves.builtins.open')
- def test_invalid_data(self, m_open):
+ def test_invalid_data(self, m_open, path_exists):
fd = six.StringIO(missing_attr_config)
fd.close = mock.Mock(return_value=None,
side_effect=lambda: fd.seek(0))
m_open.return_value = fd
+ path_exists.return_value = True
+
config.GitlabConfigParser('one')
config.GitlabConfigParser('one')
self.assertRaises(config.GitlabDataError, config.GitlabConfigParser,
@@ -107,11 +119,13 @@ class TestConfigParser(unittest.TestCase):
self.assertEqual('Unsupported per_page number: 200',
emgr.exception.args[0])
+ @mock.patch('os.path.exists')
@mock.patch('six.moves.builtins.open')
- def test_valid_data(self, m_open):
+ def test_valid_data(self, m_open, path_exists):
fd = six.StringIO(valid_config)
fd.close = mock.Mock(return_value=None)
m_open.return_value = fd
+ path_exists.return_value = True
cp = config.GitlabConfigParser()
self.assertEqual("one", cp.gitlab_id)