瀏覽代碼

Detects the execution on an`exec` command and sets the environment to `silent` mode.

Signed-off-by: Ulysses Souza <[email protected]>
Ulysses Souza 7 年之前
父節點
當前提交
f4ed9b2ef5
共有 4 個文件被更改,包括 71 次插入1 次删除
  1. 16 0
      compose/cli/command.py
  2. 2 1
      compose/config/environment.py
  3. 1 0
      requirements-dev.txt
  4. 52 0
      tests/integration/environment_test.py

+ 16 - 0
compose/cli/command.py

@@ -21,10 +21,26 @@ from .utils import get_version_info
 
 log = logging.getLogger(__name__)
 
+SILENT_COMMANDS = set((
+    'events',
+    'exec',
+    'kill',
+    'logs',
+    'pause',
+    'ps',
+    'restart',
+    'rm',
+    'start',
+    'stop',
+    'top',
+    'unpause',
+))
+
 
 def project_from_options(project_dir, options):
     override_dir = options.get('--project-directory')
     environment = Environment.from_env_file(override_dir or project_dir)
+    environment.silent = options.get('COMMAND', None) in SILENT_COMMANDS
     set_parallel_limit(environment)
 
     host = options.get('--host')

+ 2 - 1
compose/config/environment.py

@@ -56,6 +56,7 @@ class Environment(dict):
     def __init__(self, *args, **kwargs):
         super(Environment, self).__init__(*args, **kwargs)
         self.missing_keys = []
+        self.silent = False
 
     @classmethod
     def from_env_file(cls, base_dir):
@@ -95,7 +96,7 @@ class Environment(dict):
                     return super(Environment, self).__getitem__(key.upper())
                 except KeyError:
                     pass
-            if key not in self.missing_keys:
+            if not self.silent and key not in self.missing_keys:
                 log.warn(
                     "The {} variable is not set. Defaulting to a blank string."
                     .format(key)

+ 1 - 0
requirements-dev.txt

@@ -1,4 +1,5 @@
 coverage==4.4.2
+ddt==1.2.0
 flake8==3.5.0
 mock>=1.0.1
 pytest==3.6.3

+ 52 - 0
tests/integration/environment_test.py

@@ -0,0 +1,52 @@
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import tempfile
+
+from ddt import data
+from ddt import ddt
+
+from .. import mock
+from compose.cli.command import project_from_options
+from tests.integration.testcases import DockerClientTestCase
+
+
+@ddt
+class EnvironmentTest(DockerClientTestCase):
+    @classmethod
+    def setUpClass(cls):
+        super(EnvironmentTest, cls).setUpClass()
+        cls.compose_file = tempfile.NamedTemporaryFile(mode='w+b')
+        cls.compose_file.write(bytes("""version: '3.2'
+services:
+  svc:
+    image: busybox:latest
+    environment:
+      TEST_VARIABLE: ${TEST_VARIABLE}""", encoding='utf-8'))
+        cls.compose_file.flush()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(EnvironmentTest, cls).tearDownClass()
+        cls.compose_file.close()
+
+    @data('events',
+          'exec',
+          'kill',
+          'logs',
+          'pause',
+          'ps',
+          'restart',
+          'rm',
+          'start',
+          'stop',
+          'top',
+          'unpause')
+    def _test_no_warning_on_missing_host_environment_var_on_silent_commands(self, cmd):
+        options = {'COMMAND': cmd, '--file': [EnvironmentTest.compose_file.name]}
+        with mock.patch('compose.config.environment.log') as fake_log:
+            # Note that the warning silencing and the env variables check is
+            # done in `project_from_options`
+            # So no need to have a proper options map, the `COMMAND` key is enough
+            project_from_options('.', options)
+            assert fake_log.warn.call_count == 0