From b5f7d380d02bdb121dfaf9aee8e14e2f7390790a Mon Sep 17 00:00:00 2001 From: Ben Firshman Date: Fri, 21 Oct 2016 17:14:17 +0200 Subject: [PATCH] Add helpful error for APIClient methods on Client Signed-off-by: Ben Firshman --- docker/client.py | 10 ++++++++++ tests/unit/client_test.py | 14 ++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/docker/client.py b/docker/client.py index 6c5ae408..b3b47004 100644 --- a/docker/client.py +++ b/docker/client.py @@ -154,4 +154,14 @@ class Client(object): return self.api.version(*args, **kwargs) version.__doc__ = APIClient.version.__doc__ + def __getattr__(self, name): + s = ["'Client' object has no attribute '{}'".format(name)] + # If a user calls a method on APIClient, they + if hasattr(APIClient, name): + s.append("In docker-py 2.0, this method is now on the object " + "APIClient. See the low-level API section of the " + "documentation for more details.".format(name)) + raise AttributeError(' '.join(s)) + + from_env = Client.from_env diff --git a/tests/unit/client_test.py b/tests/unit/client_test.py index e22983c7..0a56b04d 100644 --- a/tests/unit/client_test.py +++ b/tests/unit/client_test.py @@ -45,6 +45,20 @@ class ClientTest(unittest.TestCase): assert client.version() == mock_func.return_value mock_func.assert_called_with() + def test_call_api_client_method(self): + client = docker.from_env() + with self.assertRaises(AttributeError) as cm: + client.create_container() + s = str(cm.exception) + assert "'Client' object has no attribute 'create_container'" in s + assert "this method is now on the object APIClient" in s + + with self.assertRaises(AttributeError) as cm: + client.abcdef() + s = str(cm.exception) + assert "'Client' object has no attribute 'abcdef'" in s + assert "this method is now on the object APIClient" not in s + class FromEnvTest(unittest.TestCase):