瀏覽代碼

Worker: Show celery logo image if using iTerm

Ask Solem 8 年之前
父節點
當前提交
982cf9d4e9
共有 5 個文件被更改,包括 50 次插入14 次删除
  1. 1 0
      MANIFEST.in
  2. 25 11
      celery/apps/worker.py
  3. 21 0
      celery/static/__init__.py
  4. 二進制
      celery/static/celery_128.png
  5. 3 3
      setup.py

+ 1 - 0
MANIFEST.in

@@ -17,6 +17,7 @@ recursive-include extra/systemd *
 recursive-include extra/zsh-completion *
 recursive-include examples *
 recursive-include requirements *.txt *.rst
+recursive-include celery/static *.png
 
 recursive-exclude * __pycache__
 recursive-exclude * *.py[co]

+ 25 - 11
celery/apps/worker.py

@@ -18,7 +18,10 @@ from functools import partial
 from billiard.process import current_process
 from kombu.utils.encoding import safe_str
 
-from celery import VERSION_BANNER, platforms, signals
+from celery import VERSION_BANNER
+from celery import platforms
+from celery import signals
+from celery import static
 from celery.app import trace
 from celery.exceptions import WorkerShutdown, WorkerTerminate
 from celery.five import string, string_t
@@ -119,9 +122,6 @@ class Worker(WorkController):
 
     def on_start(self):
         app = self.app
-        if not self._custom_logging and self.redirect_stdouts:
-            app.log.redirect_stdouts(self.redirect_stdouts_level)
-
         WorkController.on_start(self)
 
         # this signal can be used to e.g. change queues after
@@ -135,12 +135,21 @@ class Worker(WorkController):
 
         # Dump configuration to screen so we have some basic information
         # for when users sends bug reports.
+        use_image = self._term_supports_images()
+        if use_image:
+            self.termimage(static.logo_as_base64())
         print(safe_str(''.join([
-            string(self.colored.cyan(' \n', self.startup_info())),
+            string(self.colored.cyan(
+                ' \n', self.startup_info(artlines=not use_image))),
             string(self.colored.reset(self.extra_info() or '')),
         ])), file=sys.__stdout__)
         self.set_process_status('-active-')
         self.install_platform_tweaks(self)
+        if not self._custom_logging and self.redirect_stdouts:
+            app.log.redirect_stdouts(self.redirect_stdouts_level)
+
+    def _term_supports_images(self):
+        return isatty(sys.stdin) and os.environ.get('ITERM_PROFILE')
 
     def on_consumer_ready(self, consumer):
         signals.worker_ready.send(sender=consumer)
@@ -173,7 +182,11 @@ class Worker(WorkController):
             tasklist = self.tasklist(include_builtins=include_builtins)
             return EXTRA_INFO_FMT.format(tasks=tasklist)
 
-    def startup_info(self):
+    def termimage(self, s):
+        print('\n\033]1337;File=inline=1;'
+              'preserveAspectRatio=0:%s\a' % (s,))
+
+    def startup_info(self, artlines=True):
         app = self.app
         concurrency = string(self.concurrency)
         appr = '{0}:{1:#x}'.format(app.main or '__main__', id(app))
@@ -204,11 +217,12 @@ class Worker(WorkController):
         ).splitlines()
 
         # integrate the ASCII art.
-        for i, x in enumerate(banner):
-            try:
-                banner[i] = ' '.join([ARTLINES[i], banner[i]])
-            except IndexError:
-                banner[i] = ' ' * 16 + banner[i]
+        if artlines:
+            for i, x in enumerate(banner):
+                try:
+                    banner[i] = ' '.join([ARTLINES[i], banner[i]])
+                except IndexError:
+                    banner[i] = ' ' * 16 + banner[i]
         return '\n'.join(banner) + '\n'
 
     def install_platform_tweaks(self, worker):

+ 21 - 0
celery/static/__init__.py

@@ -0,0 +1,21 @@
+from __future__ import absolute_import, unicode_literals
+
+import base64
+import codecs
+import os
+
+
+def get_file(*args):
+    return os.path.join(os.path.abspath(os.path.dirname(__file__)), *args)
+
+
+def logo():
+    return get_file('celery_128.png')
+
+
+def logo_as_base64():
+    with codecs.open(logo(), mode='rb') as fh:
+        return base64.b64encode(fh.read())
+
+
+

二進制
celery/static/celery_128.png


+ 3 - 3
setup.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from setuptools import setup, find_packages
+from setuptools import setup
 
 import os
 import re
@@ -198,8 +198,8 @@ setup(
     url=meta['homepage'],
     platforms=['any'],
     license='BSD',
-    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
-    include_package_data=False,
+    packages=['celery'],
+    include_package_data=True,
     zip_safe=False,
     install_requires=install_requires,
     tests_require=reqs('test.txt'),