diff options
author | Chris Rose <offline@offby1.net> | 2018-05-16 10:29:46 -0400 |
---|---|---|
committer | Chris Rose <offline@offby1.net> | 2018-05-16 17:18:50 -0400 |
commit | 2bc68629f386e1eb4771cc363d64665e51eebea0 (patch) | |
tree | ad7ced37cfb43d8b084b051c9d802c9f1904f331 | |
parent | 413bf37df7c9bf88d70d2b046935687c072980d4 (diff) | |
download | paramiko-2bc68629f386e1eb4771cc363d64665e51eebea0.tar.gz |
Add an SSHConfig dict to provide type conversion helpers
-rw-r--r-- | paramiko/config.py | 26 | ||||
-rw-r--r-- | tests/test_config.py | 45 |
2 files changed, 71 insertions, 0 deletions
diff --git a/paramiko/config.py b/paramiko/config.py index 038d84ea..22e2e2b3 100644 --- a/paramiko/config.py +++ b/paramiko/config.py @@ -21,6 +21,7 @@ Configuration file (aka ``ssh_config``) support. """ +import collections import fnmatch import os import re @@ -295,3 +296,28 @@ class LazyFqdn(object): # Cache self.fqdn = fqdn return self.fqdn + + +class SSHConfigDict(collections.UserDict): + """A dictionary wrapper for ssh host configurations. + + This class introduces some usage niceties for consumers of SSHConfig, + specifically around the issue of variable type conversions. This offers + as_bool(key) and as_int(key) for the current raw string values in + SSHConfig""" + + def __init__(self, initialdata=None): + super(SSHConfigDict, self).__init__(initialdata) + + def as_bool(self, key): + """Express the key as a boolean value. Variations on 'yes' or boolean values + are accepted.""" + val = self[key] + if isinstance(val, bool): + return val + return val.lower() == 'yes' + + def as_int(self, key): + """Express the key as a true integer, if possible. Raises an Error otherwise + (following conventional int conversion rules)""" + return int(self[key]) diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 00000000..9edab3d9 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,45 @@ +# This file is part of Paramiko and subject to the license in /LICENSE in this +# repository + +import pytest +from paramiko import config + + +def test_SSHConfigDict_construct_empty(): + assert not config.SSHConfigDict() + + +def test_SSHConfigDict_construct_from_list(): + assert config.SSHConfigDict([(1, 2)])[1] == 2 + + +def test_SSHConfigDict_construct_from_dict(): + assert config.SSHConfigDict({1: 2})[1] == 2 + + +@pytest.mark.parametrize("true_ish", ("yes", "YES", "Yes", True)) +def test_SSHConfigDict_as_bool_true_ish(true_ish): + assert config.SSHConfigDict({"key": true_ish}).as_bool("key") is True + + +@pytest.mark.parametrize("false_ish", ("no", "NO", "No", False)) +def test_SSHConfigDict_as_bool(false_ish): + assert config.SSHConfigDict({"key": false_ish}).as_bool("key") is False + + +@pytest.mark.parametrize("int_val", ("42", 42)) +def test_SSHConfigDict_as_int(int_val): + assert config.SSHConfigDict({"key": int_val}).as_int("key") == 42 + + +@pytest.mark.parametrize("non_int", ("not an int", None, object())) +def test_SSHConfigDict_as_int_failures(non_int): + conf = config.SSHConfigDict({"key": non_int}) + + try: + int(non_int) + except Exception as e: + exception_type = type(e) + + with pytest.raises(exception_type): + conf.as_int("key") |