Skip to content

Commit

Permalink
Formatter now respects builder's chunk size.
Browse files Browse the repository at this point in the history
  • Loading branch information
seblin committed Feb 28, 2013
1 parent cd9b979 commit f361633
Showing 1 changed file with 14 additions and 17 deletions.
31 changes: 14 additions & 17 deletions shcol.py
@@ -1,15 +1,15 @@
from __future__ import division, print_function
from __future__ import print_function

from collections import namedtuple
from itertools import count
from math import ceil

try:
_range = xrange
except NameError:
_range = range

LineProperties = namedtuple('LineProperties', 'column_widths, spacing')
LineProperties = namedtuple(
'LineProperties', 'column_widths, spacing, num_lines')

def columnize(items, spacing=2, max_line_width=80):
line_properties = LinePropertyBuilder(
Expand All @@ -24,23 +24,24 @@ def __init__(self, items, spacing, max_line_width):
self.max_line_width = max_line_width

def get_properties(self):
return LineProperties(self.get_column_widths(), self.spacing)
column_widths, num_lines = self._calculate_columns()
return LineProperties(column_widths, self.spacing, num_lines)

def get_column_widths(self):
def _calculate_columns(self):
self._check_values()
if not self.item_widths:
return []
return [], 0
if any(width > self.max_line_width for width in self.item_widths):
return [self.max_line_width]
return self._calculate_column_widths()
return [self.max_line_width], len(self.item_widths)
return self._find_positionings()

def _check_values(self):
for value in (self.spacing, self.max_line_width):
if not isinstance(value, int) or value < 0:
msg = 'spacing and max_line_width must be non-negative integers'
raise ValueError(msg)

def _calculate_column_widths(self):
def _find_positionings(self):
num_items = len(self.item_widths)
for chunk_size in count(1):
column_widths = []
Expand All @@ -52,7 +53,7 @@ def _calculate_column_widths(self):
break
column_widths.append(column_width)
else:
return column_widths
return column_widths, chunk_size


class Formatter(object):
Expand All @@ -62,14 +63,10 @@ def __init__(self, line_properties, items=[]):

@property
def line_strings(self):
num_columns = self.num_columns
if num_columns == 0:
yield ''
return
num_lines = int(ceil(len(self.items) / num_columns))
chunk_size = self.line_properties.num_lines
template = self.get_line_template()
for i in _range(num_lines):
line_items = tuple(self.items[i::num_lines])
for i in _range(chunk_size):
line_items = tuple(self.items[i::chunk_size])
try:
yield template % line_items
except TypeError:
Expand Down

0 comments on commit f361633

Please sign in to comment.