Skip to content

Commit

Permalink
Fixed #114 (improved logger)
Browse files Browse the repository at this point in the history
  • Loading branch information
rubik committed Oct 24, 2011
1 parent 5de958d commit 06e65f5
Showing 1 changed file with 61 additions and 2 deletions.
63 changes: 61 additions & 2 deletions pyg/log.py
@@ -1,3 +1,4 @@
import os
import sys
import logging

Expand Down Expand Up @@ -30,6 +31,65 @@
}


def get_console_width():
"""
Return width of available window area. Autodetection works for
Windows and POSIX platforms. Returns 80 for others
Code from http://bitbucket.org/techtonik/python-wget
"""

if os.name == 'nt':
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12

# get console handle
from ctypes import windll, Structure, byref
try:
from ctypes.wintypes import SHORT, WORD, DWORD
except ImportError:
# workaround for missing types in Python 2.5
from ctypes import (
c_short as SHORT, c_ushort as WORD, c_ulong as DWORD)
console_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

# CONSOLE_SCREEN_BUFFER_INFO Structure
class COORD(Structure):
_fields_ = [("X", SHORT), ("Y", SHORT)]

class SMALL_RECT(Structure):
_fields_ = [("Left", SHORT), ("Top", SHORT),
("Right", SHORT), ("Bottom", SHORT)]

class CONSOLE_SCREEN_BUFFER_INFO(Structure):
_fields_ = [("dwSize", COORD),
("dwCursorPosition", COORD),
("wAttributes", WORD),
("srWindow", SMALL_RECT),
("dwMaximumWindowSize", DWORD)]

sbi = CONSOLE_SCREEN_BUFFER_INFO()
ret = windll.kernel32.GetConsoleScreenBufferInfo(console_handle, byref(sbi))
if ret == 0:
return 0
return sbi.srWindow.Right+1

elif os.name == 'posix':
from fcntl import ioctl
from termios import TIOCGWINSZ
from array import array

winsize = array("H", [0] * 4)
try:
ioctl(sys.stdout.fileno(), TIOCGWINSZ, winsize)
except IOError:
pass
return (winsize[1], winsize[0])[0]

return 80


class Logger(object):

VERBOSE = logging.DEBUG - 1
Expand Down Expand Up @@ -67,7 +127,6 @@ def last_msg(self):
return self._stack[-1]

def ask(self, message=None, bool=None, choices=None, dont_ask=False):

if bool is not None:
if bool in (True, False) or (isinstance(bool, (list, tuple)) and len(bool) == 1):
if bool == False:
Expand Down Expand Up @@ -178,7 +237,7 @@ def log(self, level, col, msg, *a, **kw):
## We have to clear the line in case this message is longer than
## the previous

std.write('\r' + ' ' * len(self.last_msg))
std.write('\r' + ' ' * get_console_width())
msg = '\r' + ' ' * self.indent + msg.lstrip('\r').format(*a)
else:
try:
Expand Down

0 comments on commit 06e65f5

Please sign in to comment.