29 Commits

Author SHA1 Message Date
star:Kenneth Reitz f651e71093 Merge branch 'develop' 2011-04-06 13:06:51 -04:00
star:Kenneth Reitz e500773da3 version bump (v0.2.3) 2011-04-06 13:06:14 -04:00
star:Kenneth Reitz 4b9e35c631 configurable progress interator streams 2011-04-06 13:02:40 -04:00
star:Kenneth Reitz e85fffdbb6 puts/puts_err fixes, defaults for string 2011-04-06 13:00:13 -04:00
star:Kenneth Reitz b58f8dccdc no colorama auto-init upon import 2011-04-06 10:08:25 -04:00
star:Kenneth Reitz 3d63ed01f9 whitespace cleanup 2011-04-03 08:11:23 -04:00
star:Kenneth Reitz 81165754a4 allow clint.textui.puts() to accept arbitrary file-like objects (like StringIO for <pre> generation) 2011-04-03 08:11:17 -04:00
star:Kenneth Reitz 6f106e2f12 toxic 2011-04-01 10:05:55 -04:00
star:Kenneth Reitz 8adda14a27 Merge branch 'feature/multiversion-testing' of https://github.com/offbyone/clint into develop 2011-04-01 10:04:28 -04:00
Chris Rose cc072a18f3 Add tox support 2011-04-01 07:58:48 -06:00
star:Kenneth Reitz c226b6b736 progress bar examples 2011-03-31 14:52:44 -04:00
Will Thames 3406ab5329 Added Will Thames to list of authors 2011-03-31 12:24:42 +01:00
Will Thames cf0c0bda70 Moved from __future__ line closer to the top of the file to prevent
File "piped.py", line 7
    from __future__ import with_statement
SyntaxError: from __future__ imports must occur at the beginning of the file
2011-03-31 12:21:57 +01:00
star:Kenneth Reitz a4c2be8865 pre me right 2011-03-31 06:16:09 -04:00
star:Kenneth Reitz fa2bbf9a0d link to examples directory 2011-03-31 01:07:54 -04:00
star:Kenneth Reitz 9736b4cd71 oh yeah, columns. 2011-03-31 01:05:07 -04:00
star:Kenneth Reitz 2e68207d0a updated readme for newcomers 2011-03-31 00:48:02 -04:00
star:Kenneth Reitz 164d68ce37 loggin' 2011-03-30 23:08:33 -04:00
star:Kenneth Reitz aa5008b2e0 namespace fix 2011-03-30 23:03:39 -04:00
star:Kenneth Reitz 8b7161b15b Configurable progress bars :)
Argument changes.
2011-03-30 23:03:34 -04:00
star:Kenneth Reitz 763ca94e7b newline support for textui.puts 2011-03-30 23:03:13 -04:00
star:Kenneth Reitz 2d200e3709 progress.bar(width=), not size. 2011-03-30 22:53:36 -04:00
star:Kenneth Reitz d0f2375a7b No more '>' in progress bar 2011-03-30 22:51:49 -04:00
star:Kenneth Reitz 2369bc387d progressbar => bar 2011-03-30 22:47:33 -04:00
star:Kenneth Reitz f12e47fa7c add dots progress iterator 2011-03-30 22:47:18 -04:00
star:Kenneth Reitz 5d733d123d put progress uis in separate namespace (for now) 2011-03-30 22:46:57 -04:00
star:Kenneth Reitz 9e1ea1ef91 Automatically disable color 2011-03-30 22:41:40 -04:00
star:Kenneth Reitz 6d151a0794 mention examples. 2011-03-24 07:10:40 -04:00
star:Kenneth Reitz 13afb11dea Elaborate on what Clint IS. 2011-03-24 07:08:00 -04:00
13 changed files with 147 additions and 49 deletions
+3 -1
View File
@@ -1,2 +1,4 @@
.idea
MANIFEST
MANIFEST
*.pyc
.tox
+2 -1
View File
@@ -12,4 +12,5 @@ Patches and Suggestions
- Jeff Forcier
- Morgan Goose
- Travis Swicegood
- Travis Swicegood
- Will Thames
+17
View File
@@ -1,6 +1,23 @@
History
-------
0.2.3
+++++
* Only init colors if they are used (iPython compatability)
* New progress module
* Various bugfixes
0.2.2
+++++
* Auto Color Disabling
* Progress Namespace Change
* New Progress Bars
* textui.puts newline fix
0.2.1 (2011-03-24)
++++++++++++++++++
+30 -3
View File
@@ -12,16 +12,43 @@ commandline applications.
**T** ools
.
Features:
---------
Clint is awesome. Crazy awesome. It supports colors, but detects if the session is a TTY, so doesn't render the colors if you're piping stuff around. Automagically.
Awesome nest-able indentation context manager. Example: (``with indent(4): puts('indented text')``). It supports custom email-style quotes. Of course, it supports color too, if and when needed.
It has an awesome Column printer with optional auto-expanding columns. It detects how wide your current console is and adjusts accordingly. It wraps your words properly to fit the column size. With or without colors mixed in. All with a single function call.
The world's easiest to use implicit argument system w/ chaining methods for filtering. Seriously.
Run the various executables in examples_ to get a good feel for what Clint offers.
.. _examples: https://github.com/kennethreitz/clint/tree/develop/examples
You'll never want to not use it.
Current Features:
-----------------
- Little Documentation (bear with me for now)
- CLI Colors and Indents
- Extremely Simple + Powerful Column Printer
- Iterator-based Progress Bar
- Implicit Argument Handling
- Simple Support for Unix Pipes
- Simple Support for Incoming Unix Pipes
- Application Directory management
Future Features:
----------------
- Documentation!
- Simple choice system ``Are you sure? [Yn]``
- Default query system ``Installation Path [/usr/local/bin/]``
- Suggestions welcome.
Example
-------
+2 -2
View File
@@ -19,8 +19,8 @@ from .pipes import piped_in
__title__ = 'clint'
__version__ = '0.2.1'
__build__ = 0x000201
__version__ = '0.2.3'
__build__ = 0x000203
__author__ = 'Kenneth Reitz'
__license__ = 'ISC'
__copyright__ = 'Copyright 2011 Kenneth Reitz'
+8 -8
View File
@@ -39,7 +39,7 @@ class AppDir(object):
def __repr__(self):
return '<app-dir: %s>' % (self.path)
def __getattribute__(self, name):
@@ -53,11 +53,11 @@ class AppDir(object):
"""Raises if operations are carried out on an unconfigured AppDir."""
if not self.path:
raise NotConfigured()
def _create(self):
"""Creates current AppDir at AppDir.path."""
self._raise_if_none()
if not self._exists:
mkdir_p(self.path)
@@ -66,7 +66,7 @@ class AppDir(object):
def open(self, filename, mode='r'):
"""Returns file object from given filename."""
self._raise_if_none()
fn = path_join(self.path, filename)
@@ -121,11 +121,11 @@ class AppDir(object):
else:
raise why
def read(self, filename, binary=False):
"""Returns contents of given file with AppDir.
If file doesn't exist, returns None."""
self._raise_if_none()
fn = path_join(self.path, filename)
@@ -161,11 +161,11 @@ log = AppDir()
def init(vendor, name):
global user, site, cache, log
ad = AppDirs(name, vendor)
user.path = ad.user_data_dir
site.path = ad.site_data_dir
cache.path = ad.user_cache_dir
log.path = ad.user_log_dir
+2
View File
@@ -10,4 +10,6 @@ This module provides the text output helper system.
from . import colored
from . import progress
from core import *
+10 -9
View File
@@ -25,8 +25,8 @@ __all__ = (
COLORS = __all__[:-2]
DISABLE_COLOR = False
if sys.stdout.isatty():
colorama.init(autoreset=True)
if not sys.stdout.isatty():
DISABLE_COLOR = True
class ColoredString(object):
@@ -39,6 +39,7 @@ class ColoredString(object):
@property
def color_str(self):
if sys.stdout.isatty() and not DISABLE_COLOR:
colorama.init(autoreset=True)
return '%s%s%s' % (
getattr(colorama.Fore, self.color), self.s, colorama.Fore.RESET)
else:
@@ -47,25 +48,25 @@ class ColoredString(object):
def __len__(self):
return len(self.s)
def __repr__(self):
return "<%s-string: '%s'>" % (self.color, self.s)
def __str__(self):
return self.__unicode__().encode('utf8')
def __unicode__(self):
return self.color_str
def __add__(self, other):
return str(self.color_str) + str(other)
def __radd__(self, other):
return str(other) + str(self.color_str)
def __mul__(self, other):
return (self.color_str * other)
def split(self, x=' '):
return map(self._new, self.s.split(x))
+8 -9
View File
@@ -13,13 +13,12 @@ from __future__ import absolute_import
import sys
from .progress import progressbar
from .formatters import max_width, min_width
from .cols import columns
from ..utils import tsplit
__all__ = ('puts', 'puts_err', 'indent', 'progressbar', 'columns', 'max_width', 'min_width')
__all__ = ('puts', 'puts_err', 'indent', 'columns', 'max_width', 'min_width')
STDOUT = sys.stdout.write
@@ -63,14 +62,14 @@ class Writer(object):
def __call__(self, s, newline=True, stream=STDOUT):
if newline:
s = tsplit(s, NEWLINES)
s = map(str, s)
indent = ''.join(self.shared['indent_strings'])
s = (str('\n' + indent)).join(s)
_str = ''.join((
''.join(self.shared['indent_strings']),
str(s),
@@ -79,14 +78,14 @@ class Writer(object):
stream(_str)
def puts(s, newline=True):
def puts(s='', newline=True, stream=STDOUT):
"""Prints given string to stdout via Writer interface."""
Writer()(s, stream=STDOUT)
Writer()(s, newline, stream=stream)
def puts_err(s, newline=True):
def puts_err(s='', newline=True, stream=STDERR):
"""Prints given string to stderr via Writer interface."""
Writer()(s, stream=STDERR)
Writer()(s, newline, stream=stream)
def indent(indent=4, quote=''):
+46 -10
View File
@@ -12,21 +12,57 @@ from __future__ import absolute_import
import sys
STREAM = sys.stderr
def progressbar(it, prefix='', size=32, hide=False):
BAR_TEMPLATE = '%s[%s%s] %i/%i\r'
BAR_EMPTY_CHAR = '-'
BAR_FILLED_CHAR = '='
DOTS_CHAR = '.'
def bar(it, label='', width=32, hide=False):
"""Progress iterator. Wrap your iterables with it."""
count = len(it)
if count:
def _show(_i):
x = int(size*_i/count)
if not hide:
sys.stdout.write("%s[%s>%s] %i/%i\r" % (prefix, "="*x, "-"*(size-x), _i, count))
sys.stdout.flush()
def _show(_i):
x = int(width*_i/count)
if not hide:
STREAM.write(BAR_TEMPLATE % (
label, BAR_FILLED_CHAR*x, BAR_EMPTY_CHAR*(width-x), _i, count))
STREAM.flush()
count = len(it)
if count:
_show(0)
for i, item in enumerate(it):
yield item
_show(i+1)
if not hide:
sys.stdout.write("\n")
sys.stdout.flush()
STREAM.write('\n')
STREAM.flush()
def dots(it, label='', hide=False):
"""Progress iterator. Prints a dot for each item being iterated"""
count = 0
if not hide:
STREAM.write(label)
for item in it:
if not hide:
STREAM.write(DOTS_CHAR)
sys.stderr.flush()
count += 1
yield item
STREAM.write('\n')
STREAM.flush()
+3 -3
View File
@@ -1,11 +1,11 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import with_statement
import sys
import os
from __future__ import with_statement
sys.path.insert(0, os.path.abspath('..'))
from clint import piped_in
@@ -23,4 +23,4 @@ if __name__ == '__main__':
with indent(5, quote=colored.red(' |')):
puts(in_data)
else:
puts(colored.red('Warning: ') + 'No data was piped in.')
puts(colored.red('Warning: ') + 'No data was piped in.')
+4 -3
View File
@@ -8,12 +8,13 @@ sys.path.insert(0, os.path.abspath('..'))
from time import sleep
from random import random
from clint.textui import progressbar
from clint.textui import progress
if __name__ == '__main__':
for i in progressbar(range(100)):
for i in progress.bar(range(100)):
sleep(random() * 0.2)
for i in progress.dots(range(100)):
sleep(random() * 0.2)
+12
View File
@@ -0,0 +1,12 @@
[tox]
envlist = py25,py26,py27,py3
[testenv]
commands=py.test --junitxml=junit-{envname}.xml
deps = pytest
[testenv:pypy]
basepython=/usr/bin/pypy-c
[testenv:py3]
basepython=/usr/bin/python3