Doctests

Wie und wo?

Sie werden direkt im Quellcode, für gewöhnlich im Doc-String untergebracht und beginnen mit dem klassischen Python-Prompt den drei »>>> «.

Aufgaben

  • Laden Sie alle benötigten Dateien herunter.

  • Führen Sie die Tests durch.

  • Nehmen Sie die Herausfordrung weiter unten an!

Es folgt der Inhalt der Haupklasse:

"""
Basis-Klasse zum laden und lesen von csv-Dateien

"""
import csv
import textwrap

class CSVSearch():
    def __init__(self, csvfile, header="yes", delimiter=';'):
        self.delimiter = delimiter
        self.header = header
        self.csvfile = csvfile
        self.result = []
        self._fieldnames = []

        with open(self.csvfile) as csvfile:
            self.reader = csv.DictReader(csvfile, delimiter=self.delimiter, )
            self._fieldnames = self.reader.fieldnames

    def getfieldnames(self):
        """
        Extrakt Fieldnames from fist line

        :return: List of Fieldnames
        >>> t = CSVSearch(csvfile="files/laika-leistungen-utf8.csv")
        >>> t.getfieldnames()[:2]
        ['Schluessel', 'Leistungsgruppierung']
        """
        return self._fieldnames

    def gettopten(self, rows=10, idx=[0, 1]):
        """ get the first ten rows

        >>> t = CSVSearch(csvfile="files/laika-leistungen-utf8.csv")
        >>> t.gettopten()[:2]
        [['99001001000000', 'Abfall'], ['99001001002000', 'Abfall']]
        """
        with open('files/laika-leistungen-utf8.csv') as csvfile:
            self.reader = csv.DictReader(csvfile, delimiter=';')
            while len(self.result) < rows:
                for row in self.reader:
                    liste = []
                    for i in idx:
                        t = f"{textwrap.shorten(row[self._fieldnames[i]], width=30, placeholder='...')}"
                        liste.append(t)
                    self.result.append(liste)
                    break
        return self.result

Aufruf

Der Aufruf kann mit jedem Test-Werkzeug für Python ausgeführt werden. Hier wird das interne doctest-Modul verwendet.

python -m doctest laika_search.py
# wer die Ausgabe sehen will:
python -m doctest -v laika_search.py

Herausforderung

Für dieses Modul gibt es noch keine Implentierungen. Erweitern sie die Klasse um weitere Methoden und dokumentieren Sie die Funktion, inklusive eines Doctests.

""" Laika-Suche

Dieses Modul liest den Laika-Katalog ein und
erlaubt eine Suche nach diversen Kriterien.
"""

import csv
import textwrap as tw
import json
import xml.etree.cElementTree as ET

class LaikaSearch:
    """ Class delivering search results from a csv file
    >>> fh = open('./files/laika-leistungen-utf8.csv', 'r')
    >>> fh.close()
    """

    def __init__(self, result=None, rows=10):
        if result is None:
            self.result = []
        self.rows = rows
        with open('files/laika-leistungen-utf8.csv') as csvfile:
            self.reader = csv.DictReader(csvfile, delimiter=';')
            self._fnames = self.reader.fieldnames

    def getfieldnames(self):
        """
        >>> t = LaikaSearch()
        >>> t.getfieldnames()[:2]
        ['Schluessel', 'Leistungsgruppierung']
        """
        return self._fnames

    def gettopten(self, rows=10, idx=[0, 1]):
        """ get the first ten rows

        >>> t = LaikaSearch()
        >>> t.gettopten()[:2]
        [['99001001000000', 'Abfall'], ['99001001002000', 'Abfall']]
        """
        if idx is None:
            self.idx = [1, 2]

        with open('files/laika-leistungen-utf8.csv') as csvfile:
            self.reader = csv.DictReader(csvfile, delimiter=';')
            while len(self.result) < self.rows:
                for row in self.reader:
                    liste = []
                    for i in idx:
                        liste.append(
                            f"{tw.shorten(row[self._fnames[i]], width=30, placeholder='...')}"
                        )
                    self.result.append(liste)
                    break
        return self.result

    def csv2json(self):
        """ Export dict to json"""
        self.gettopten()
        return json.dumps(self.result)

    def csv2xml(self):
        """ Export dict to xml"""
        liste = self.gettopten()
        results = ET.Element("results")
        result = ET.SubElement(results,"result")
        for item in liste:
            ET.SubElement(item)
        return str(results)
    
if __name__ == "__main__":
    import doctest
    doctest.testmod()