From 4f6b5ca2e9113b5c2f9abab703161fcc3b3a2adb Mon Sep 17 00:00:00 2001 From: "Adam J. Gamble" Date: Wed, 28 Nov 2012 16:50:11 +0000 Subject: [PATCH] Doctest skeleton added. * minor fix on indexing (-i) * alphabet() => outside of Collate object --- colly/DOCTEST | 0 colly/commands/__init__.py | 7 +++++-- colly/core.py | 49 ++++++++++++++++++++++++++++------------------ 3 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 colly/DOCTEST diff --git a/colly/DOCTEST b/colly/DOCTEST new file mode 100644 index 0000000..e69de29 diff --git a/colly/commands/__init__.py b/colly/commands/__init__.py index 03aa288..2742d85 100644 --- a/colly/commands/__init__.py +++ b/colly/commands/__init__.py @@ -106,7 +106,7 @@ class CsvCommand(Command): ''' makes empty list of commas, & appends 'pk' at index pos. ''' i = int(options.index[n][0]) - kwargs['headings'] = [',']*(i-1)+['pk'] + kwargs['headings'] = [',']*(i)+['pk'] except IndexError: pass else: @@ -132,7 +132,7 @@ def load_command(name): try: __import__(full_name) except ImportError: - pass + logging.info("Couldn't import %s" % (full_name)) def load_all_commands(): for name in command_names(): @@ -141,3 +141,6 @@ def load_all_commands(): def command_names(): names = set((pkg[1] for pkg in walk_packages(path=__path__))) return list(names) + +def call_command(name, *args, **options): + pass diff --git a/colly/core.py b/colly/core.py index 5d5991c..7b53ef5 100644 --- a/colly/core.py +++ b/colly/core.py @@ -9,7 +9,7 @@ from colly.exceptions import CsvImportError import simplejson as json -class Collate(object): +class Collate(object): _rows = {} headings = "" @@ -17,7 +17,7 @@ class Collate(object): ''' Csv parsing and formatting. ''' - def __init__(self, csv_file, **options): + def __init__(self, csv_file, **options): with open(csv_file, "rb") as f: raw = csv.reader(f) @@ -78,34 +78,21 @@ class Collate(object): resolves to: "A,B,film,director,E" ''' + headings = headings or [] if len(sample) < len(headings): raise CsvImportError("Given headings exceeded those in CSV") - alpha = list(string.uppercase) for n, col in enumerate(sample): + auto_heading = alphabet(n) try: if re.match(r'^\s|,|$', headings[n]): - headings[n] = self.alpha(n) + headings[n] = auto_heading except IndexError: - headings.append(self.alpha(n)) + headings.append(auto_heading) logging.info("CSV columns given headings: %s" % (headings)) return headings - def alpha(self, n): - ''' returns letter of alphabet at 'n', then increments A2,B2,C2 etc. - ''' - if n < 26: - return string.uppercase[n] - - diff = float(n) / 26 - step = int(round((diff % 1) * 26)) - - return "%s%s" % ( - string.uppercase[step], - str(int(diff)) #: number of iterations of alphabet - ) - def get_row(self, pk): return self._rows[pk] @@ -116,3 +103,27 @@ class Collate(object): for i in self.column: m[i] = self._rows[i]._asdict() #: turn _rows (namedtuple) into dict => dump. return json.dumps(m) + +''' Helpers +''' +def alphabet(n): + ''' returns letter of alphabet at 'n', then increments A2, B2, C2 eg: + >>> assert (alphabet(0), alphabet(25)) == ('A', 'Z') + >>> assert alphabet(26) == 'A2' + >>> assert alphabet(42) == 'Q2' + >>> assert alphabet(52) == 'A3' + ''' + if n < 26: + return string.uppercase[n] + + diff = float(n) / 26 + step = int(round((diff % 1) * 26)) + + return "%s%s" % ( + string.uppercase[step], + str(int(diff+1)) #: number of iterations of alphabet, start at '2' + ) + +if __name__ == "__main__": + import doctest + doctest.testmod() -- 2.11.4.GIT