32 Commits

Author SHA1 Message Date
Kenneth Reitz 4336c354de v0.3.1 2012-01-16 09:25:54 -05:00
Kenneth Reitz 43b152cf0e Merge branch 'develop' of github.com:kennethreitz/clint into develop 2012-01-16 09:22:05 -05:00
Kenneth Reitz 0d0d482156 Merge branch 'f/unicode' of https://github.com/collinwat/clint 2012-01-16 09:15:29 -05:00
Collin Watson 3a40b682f4 Support python 3 by checking if the decode attribute exists. 2012-01-14 17:03:10 -08:00
Collin Watson 1d1bb71203 Added unicode file and input examples 2012-01-14 12:17:46 -08:00
Collin Watson b917e68837 Removed unnecessary interpolation since it's a known string 2012-01-14 12:17:29 -08:00
Kenneth Reitz 66a6148088 Merge pull request #30 from alejandrogomez/develop
Add a mill progress indicator to `progress.py`
2012-01-14 10:20:52 -08:00
Alejandro Gómez a95e803268 Add a mill progress indicator to progress.py
I've created a progress indicator that outputs a "mill" and added it to
the `progress.py` file.

Very simple stuff but its more compact than the other progress bars and
it can be useful when using long labels.
2012-01-14 19:01:23 +01:00
Collin Watson 7e1c739755 Ignore unicode strings as they are already decoded 2012-01-14 01:11:47 -08:00
Collin Watson ec46d65bd2 Added support for colored unicode 2012-01-14 00:59:44 -08:00
Kenneth Reitz 73a9cd836b Merge pull request #24 from kracekumar/develop
Develop - fixed issue 9
2012-01-11 05:42:50 -08:00
kracekumar c9bf3bac3a works perfectly fine with ipython, standard python interpreter and unfortuantely clint colors wont work in dreampie :( 2012-01-07 21:54:17 +05:30
kracekumar 5f2df1218a fixed spaces 2012-01-07 21:47:55 +05:30
kracekumar 526cf84ebb added a method to find current python interpreter is ipython, if so color shoudl be disabled 2012-01-07 21:45:31 +05:30
Kenneth Reitz 3709f090b4 Merge pull request #22 from teh/develop
Distribute README.rst and HISTORY.rst when building sdist.
2012-01-06 15:45:01 -08:00
Thomas Hunger d6214ababb Distribute README.rst and HISTORY.rst when building sdist. 2012-01-06 23:43:14 +00:00
Kenneth Reitz ee089c2d39 Merge branch 'develop' 2012-01-05 22:14:51 -05:00
Kenneth Reitz dbb063840a v0.3.0 2012-01-05 22:14:33 -05:00
Thomas Kluyver 9a4705f090 Update trove classifiers. 2012-01-06 00:16:14 +00:00
Thomas Kluyver b16b2ce723 All examples work on Python 3. 2012-01-06 00:11:51 +00:00
Thomas Kluyver 1ea4c5afdc Installable on Python 3. 2012-01-05 23:24:25 +00:00
Kenneth Reitz 39bb08253f Merge pull request #20 from robbles/develop
fix mismatch with argument names for progress.bar
2011-12-24 23:01:49 -08:00
Kenneth Reitz 8e6973253f Update clint/textui/progress.py 2011-10-28 13:04:31 -03:00
robbles 84419f6bfb fix mismatch with argument names for progress.bar 2011-09-28 11:13:26 -07:00
Kenneth Reitz 53ec4c2e09 Merge branch 'develop' 2011-09-24 14:38:05 -04:00
Kenneth Reitz 7b6138eda6 v0.2.5 2011-09-24 14:36:30 -04:00
Kenneth Reitz d19650b93c add userpath and environ var expansion to expand_path 2011-09-24 14:33:13 -04:00
Kenneth Reitz 98edec43e9 move expand_path to utils 2011-09-24 14:32:47 -04:00
Kenneth Reitz ef48a47b8d Merge branch 'master' into develop 2011-09-24 14:30:05 -04:00
Kenneth Reitz 3be47add4a rename arguments for bar 2011-08-12 09:48:24 -04:00
Kenneth Reitz bf99084ece Merge pull request #18 from maraujop/develop
Adding kwargs to progress bar, so that bar chars can be customized
2011-08-12 06:46:42 -07:00
Miguel Araujo Perez 705cda4443 Adding kwargs to progress bar, so that bar_empty_char and bar_filled_char can be easily customized. 2011-08-11 16:19:48 +02:00
21 changed files with 241 additions and 82 deletions
+1
View File
@@ -2,3 +2,4 @@
MANIFEST
*.pyc
.tox
build/
+5 -1
View File
@@ -14,4 +14,8 @@ Patches and Suggestions
- Morgan Goose
- Travis Swicegood
- Will Thames
- Greg Haskins
- Greg Haskins
- Miguel Araujo <maraujop>
- takluyver
- kracekumar
- Alejandro Gómez <alejandrogomez>
+1 -1
View File
@@ -11,4 +11,4 @@ All functionality should be available in pure Python. Optional C (via Cython)
implementations may be written for performance reasons, but should never
replace the Python implementation.
Lastly, don't take yourself too seriously :)
Lastly, don't take yourself too seriously :)
+13
View File
@@ -1,6 +1,19 @@
History
-------
0.3.1
+++++
* Progress mill indicator.
* Colored unicode support.
* Fix ipython nuance.
0.3.0
+++++
* Python 3 support!
0.2.4
+++++
+3 -3
View File
@@ -19,11 +19,11 @@ from .pipes import piped_in
__title__ = 'clint'
__version__ = '0.2.4'
__build__ = 0x000204
__version__ = '0.3.1'
__build__ = 0x000301
__author__ = 'Kenneth Reitz'
__license__ = 'ISC'
__copyright__ = 'Copyright 2011 Kenneth Reitz'
__copyright__ = 'Copyright 2012 Kenneth Reitz'
__docformat__ = 'restructuredtext'
+22 -38
View File
@@ -13,33 +13,17 @@ from __future__ import absolute_import
import os
from sys import argv
from glob import glob
from .packages.ordereddict import OrderedDict
from .utils import is_collection
try:
from collections import OrderedDict
except ImportError:
from .packages.ordereddict import OrderedDict
from .utils import expand_path, is_collection
__all__ = ('Args', )
def _expand_path(path):
"""Expands directories and globs in given path."""
paths = []
if os.path.isdir(path):
for (dir, dirs, files) in os.walk(path):
for file in files:
paths.append(os.path.join(dir, file))
else:
paths.extend(glob(path))
return paths
class Args(object):
"""CLI Argument management."""
@@ -110,20 +94,20 @@ class Args(object):
def any_contain(self, x):
"""Tests if given string is contained in any stored argument."""
return bool(self.first_with(x))
def contains(self, x):
"""Tests if given object is in arguments list.
"""Tests if given object is in arguments list.
Accepts strings and lists of strings."""
return self.__contains__(x)
def first(self, x):
"""Returns first found index of given value (or list of values)"""
def _find( x):
try:
return self.all.index(str(x))
@@ -212,7 +196,7 @@ class Args(object):
return False
else:
return (x in self.all[index])
except IndexError:
return False
@@ -221,7 +205,7 @@ class Args(object):
"""Returns true if argument exists at given index.
Accepts: integer.
"""
try:
self.all[x]
return True
@@ -231,15 +215,15 @@ class Args(object):
def value_after(self, x):
"""Returns value of argument after given found argument (or list thereof)."""
try:
try:
i = self.all.index(x)
except ValueError:
return None
return self.all[i + 1]
except IndexError:
return None
@@ -266,21 +250,21 @@ class Args(object):
return collection
@property
def last(self):
"""Returns last argument."""
try:
return self.all[-1]
except IndexError:
return None
@property
def all(self):
"""Returns all arguments."""
return self._args
@@ -288,7 +272,7 @@ class Args(object):
"""Returns all arguments containing given string (or list thereof)"""
_args = []
for arg in self.all:
if is_collection(x):
for _x in x:
@@ -327,7 +311,7 @@ class Args(object):
return self.start_with('-')
@property
@property
def not_flags(self):
"""Returns Arg object excluding flagged arguments."""
@@ -341,7 +325,7 @@ class Args(object):
_paths = []
for arg in self.all:
for path in _expand_path(arg):
for path in expand_path(arg):
if os.path.exists(path):
if absolute:
_paths.append(os.path.abspath(path))
@@ -358,7 +342,7 @@ class Args(object):
_args = []
for arg in self.all:
if not len(_expand_path(arg)):
if not len(expand_path(arg)):
if not os.path.exists(arg):
_args.append(arg)
+12 -6
View File
@@ -7,12 +7,18 @@ clint.eng
This module provides English language string helpers.
"""
from __future__ import print_function
MORON_MODE = False
COMMA = ','
CONJUNCTION = 'and'
SPACE = ' '
try:
unicode
except NameError:
unicode = str
def join(l, conj=CONJUNCTION, im_a_moron=MORON_MODE, seperator=COMMA):
"""Joins lists of words. Oxford comma and all."""
@@ -41,9 +47,9 @@ def join(l, conj=CONJUNCTION, im_a_moron=MORON_MODE, seperator=COMMA):
return unicode(str().join(collector))
if __name__ == '__main__':
print join(['blue', 'red', 'yellow'], conj='or', im_a_moron=True)
print join(['blue', 'red', 'yellow'], conj='or')
print join(['blue', 'red'], conj='or')
print join(['blue', 'red'], conj='and')
print join(['blue'], conj='and')
print join(['blue', 'red', 'yellow', 'green', 'ello'], conj='and')
print(join(['blue', 'red', 'yellow'], conj='or', im_a_moron=True))
print(join(['blue', 'red', 'yellow'], conj='or'))
print(join(['blue', 'red'], conj='or'))
print(join(['blue', 'red'], conj='and'))
print(join(['blue'], conj='and'))
print(join(['blue', 'red', 'yellow', 'green', 'ello'], conj='and'))
+1 -1
View File
@@ -115,7 +115,7 @@ class AppDir(object):
remove(fn)
else:
removedirs(fn)
except OSError, why:
except OSError as why:
if why.errno == errno.ENOENT:
pass
else:
+1 -1
View File
@@ -12,4 +12,4 @@ This module provides the text output helper system.
from . import colored
from . import progress
from core import *
from .core import *
+25 -9
View File
@@ -14,6 +14,8 @@ from __future__ import absolute_import
import re
import sys
PY3 = sys.version_info[0] >= 3
from ..packages import colorama
__all__ = (
@@ -23,12 +25,17 @@ __all__ = (
)
COLORS = __all__[:-2]
DISABLE_COLOR = False
if not sys.stdout.isatty():
if 'get_ipython' in dir():
"""
when ipython is fired lot of variables like _oh, etc are used.
There are so many ways to find current python interpreter is ipython.
get_ipython is easiest is most appealing for readers to understand.
"""
DISABLE_COLOR = True
else:
colorama.init(autoreset=True)
DISABLE_COLOR = False
class ColoredString(object):
@@ -53,11 +60,20 @@ class ColoredString(object):
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
value = self.color_str
if isinstance(value, str) and hasattr(value, 'decode'):
return value.decode('utf8')
return value
if PY3:
__str__ = __unicode__
else:
def __str__(self):
return unicode(self).encode('utf8')
def __iter__(self):
return iter(self.color_str)
def __add__(self, other):
return str(self.color_str) + str(other)
@@ -68,8 +84,8 @@ class ColoredString(object):
def __mul__(self, other):
return (self.color_str * other)
def split(self, x=' '):
return map(self._new, self.s.split(x))
def split(self, sep=None):
return [self._new(s) for s in self.s.split(sep)]
def _new(self, s):
return ColoredString(self.color, s)
+35 -5
View File
@@ -15,20 +15,21 @@ import sys
STREAM = sys.stderr
BAR_TEMPLATE = '%s[%s%s] %i/%i\r'
BAR_EMPTY_CHAR = '-'
BAR_FILLED_CHAR = '='
MILL_TEMPLATE = '%s %s %i/%i\r'
DOTS_CHAR = '.'
BAR_FILLED_CHAR = '#'
BAR_EMPTY_CHAR = ' '
MILL_CHARS = ['|', '/', '-', '\\']
def bar(it, label='', width=32, hide=False):
def bar(it, label='', width=32, hide=False, empty_char=BAR_EMPTY_CHAR, filled_char=BAR_FILLED_CHAR):
"""Progress iterator. Wrap your iterables with it."""
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))
label, filled_char*x, empty_char*(width-x), _i, count))
STREAM.flush()
count = len(it)
@@ -66,3 +67,32 @@ def dots(it, label='', hide=False):
STREAM.write('\n')
STREAM.flush()
def mill(it, label='', hide=False,):
"""Progress iterator. Prints a mill while iterating over the items."""
def _mill_char(_i):
if _i == 100:
return ' '
else:
return MILL_CHARS[_i % len(MILL_CHARS)]
def _show(_i):
if not hide:
STREAM.write(MILL_TEMPLATE % (
label, _mill_char(_i), _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:
STREAM.write('\n')
STREAM.flush()
+29 -5
View File
@@ -11,9 +11,33 @@ Various Python helpers used within clint.
from __future__ import absolute_import
from __future__ import with_statement
import sys
import errno
import os.path
from os import makedirs
from glob import glob
try:
basestring
except NameError:
basestring = str
def expand_path(path):
"""Expands directories and globs in given path."""
paths = []
path = os.path.expanduser(path)
path = os.path.expandvars(path)
if os.path.isdir(path):
for (dir, dirs, files) in os.walk(path):
for file in files:
paths.append(os.path.join(dir, file))
else:
paths.extend(glob(path))
return paths
def is_collection(obj):
@@ -29,7 +53,7 @@ def mkdir_p(path):
"""Emulates `mkdir -p` behavior."""
try:
makedirs(path)
except OSError, exc: # Python >2.5
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST:
pass
else:
@@ -37,17 +61,17 @@ def mkdir_p(path):
def tsplit(string, delimiters):
"""Behaves str.split but supports tuples of delimiters."""
delimiters = tuple(delimiters)
stack = [string,]
for delimiter in delimiters:
for i, substring in enumerate(stack):
substack = substring.split(delimiter)
stack.pop(i)
for j, _substring in enumerate(substack):
stack.insert(i+j, _substring)
return stack
def schunk(string, size):
+3 -1
View File
@@ -1,6 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import os
@@ -13,4 +15,4 @@ text = 'THIS TEXT IS COLORED %s!'
if __name__ == '__main__':
for color in colored.COLORS:
print getattr(colored, color)(text % color.upper())
print(getattr(colored, color)(text % color.upper()))
+1 -1
View File
@@ -17,7 +17,7 @@ colors = [
colored.magenta('magenta')
]
colors = map(str, colors)
colors = [str(cs) for cs in colors]
puts('Smart:')
+3 -1
View File
@@ -17,4 +17,6 @@ if __name__ == '__main__':
for i in progress.dots(range(100)):
sleep(random() * 0.2)
for i in progress.mill(range(100)):
sleep(random() * 0.2)
+7 -5
View File
@@ -1,6 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import os
@@ -13,16 +15,16 @@ resources.init('kennethreitz', 'clint')
lorem = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
print '%s created.' % resources.user.path
print('%s created.' % resources.user.path)
resources.user.write('lorem.txt', lorem)
print 'lorem.txt created'
print('lorem.txt created')
assert resources.user.read('lorem.txt') == lorem
print 'lorem.txt has correct contents'
print('lorem.txt has correct contents')
resources.user.delete('lorem.txt')
print 'lorem.txt deleted'
print('lorem.txt deleted')
assert resources.user.read('lorem.txt') == None
print 'lorem.txt deletion confirmed'
print('lorem.txt deletion confirmed')
+3 -2
View File
@@ -19,5 +19,6 @@ if __name__ == '__main__':
col = 60
puts(columns([(colored.red('Column 1')), col], [(colored.green('Column Two')), None], [(colored.magenta('Column III')), col]))
puts(columns(['hi there my name is kenneth and this is a columns', col], [lorem, None], ['kenneths', col]))
puts(columns([(colored.red('Column 1')), col], [(colored.green('Column Two')), None],
[(colored.magenta('Column III')), col]))
puts(columns(['hi there my name is kenneth and this is a columns', col], [lorem, None], ['kenneths', col]))
+4
View File
@@ -0,0 +1,4 @@
{
"title": "Bashō's 'old pond'",
"text": "古池や蛙飛込む水の音"
}
+59
View File
@@ -0,0 +1,59 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import codecs
sys.path.insert(0, os.path.abspath('..'))
try:
import json
except:
import simplejson as json
from clint import args
from clint import piped_in
from clint.textui import colored, puts, indent
if __name__ == '__main__':
puts('Test:')
with indent(4):
puts('%s Fake test 1.' % colored.green(''))
puts('%s Fake test 2.' % colored.red(''))
puts('')
puts('Greet:')
with indent(4):
puts(colored.red('Здравствуйте'))
puts(colored.green('你好。'))
puts(colored.yellow('سلام'))
puts(colored.magenta('안녕하세요'))
puts(colored.blue('नमस्ते'))
puts(colored.cyan('γειά σου'))
puts('')
puts('Arguments:')
with indent(4):
puts('%s' % colored.red(args[0]))
puts('')
puts('File:')
with indent(4):
f = args.files[0]
puts(colored.yellow('%s:' % f))
with indent(2):
fd = codecs.open(f, encoding='utf-8')
for line in fd:
line = line.strip('\n\r')
puts(colored.yellow(' %s' % line))
fd.close()
puts('')
puts('Input:')
with indent(4):
in_data = json.loads(piped_in())
title = in_data['title']
text = in_data['text']
puts(colored.blue('Title: %s' % title))
puts(colored.magenta('Text: %s' % text))
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env sh
python unicode.py こんにちは。 unicode.json < unicode.json
Regular → Executable
+10 -2
View File
@@ -29,6 +29,10 @@ setup(
author='Kenneth Reitz',
author_email='me@kennethreitz.com',
url='https://github.com/kennethreitz/clint',
data_files=[
'README.rst',
'HISTORY.rst',
],
packages= [
'clint',
'clint.textui',
@@ -38,14 +42,18 @@ setup(
license='ISC',
classifiers=(
# 'Development Status :: 5 - Production/Stable',
'Environment :: Console',
'Intended Audience :: Developers',
'Natural Language :: English',
'License :: OSI Approved :: ISC License (ISCL)',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.5',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
# 'Programming Language :: Python :: 3.0',
# 'Programming Language :: Python :: 3.1',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.1',
'Programming Language :: Python :: 3.2',
'Topic :: Terminals :: Terminal Emulators/X Terminals',
),
)