The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Prty::ContentProcessor - Prozessor für Abschnitts-Dateien

BASE CLASS

Prty::Hash

SYNOPSIS

    use Prty::ContentProcessor;
    
    $cop = Prty::ContentProcessor->new('.mytool');
    $cop->registerType('MyTool::Program::Shell','.mprg','[Program]',Language=>'Shell');
    ...
    $cop->load(@paths)->generate($dir)->test;

DESCRIPTION

Ein Objekt der Klasse repräsentiert einen Prozessor für Entitäts-Dateien. Die Dateien bestehen aus einer Folge von Abschnitten, die von einem Abschnitts-Parser (s. Klasse Prty::Section::Parser) geparsed und zu Abschnitts-Objekten instantiiert werden.

Der Prozessor delegiert die Verarbeitung der Abschnitts-Objekte an die per registerType() registierten Entitäts-Klassen (Plugin-Schnittstelle). Diese bauen aus den Abschnitts-Objekten Entitäts-Strukturen auf, aus denen die Ausgabedateien generiert werden.

Ausgaben

Der Umfang an Ausgaben wird mit der Konstruktor-Option -verbosity=>$level eingestellt. Default ist 1.

Die Methode msg() schreibt eine Ausgabe nach STDERR. Der erste Parameter gibt den Verbosity-Level an. Ist dieser größer als der eingestellte Verbosity-Level, unterbleibt die Ausgabe. Ist als Level 0 angegeben, erfolgt die Ausgabe immer:

    $cop->msg(0,...);

EXAMPLES

Alle Entitäts-Definitionen im Storage in eine einzige Datei $file schreiben (z.B. für Refactoring):

    $cop->load->join($file);

Alle Entitäts-Definitionen im Storage in eine Verzeichnisstruktur mit Wurzelverzeichnis $dir übertragen (z.B. um die Dateien einzeln zu editieren):

    $cop->fetch->($dir);

Alle Entitäten im Storage vom Typ $type auflisten:

    $cop->load;
    for my $ent ($cop->entities($type)) {
        $cop->msg(0,$ent->name);
    }

METHODS

Konstruktor

new() - Instantiiere ContentProcessor

Synopsis

    $cop = $class->new($storageDir,@opt);

Description

Instantiiere ein ContentProcessor-Objekt und liefere eine Referenz auf dieses Objekt zurück.

Arguments

$storage

Der Name des Storage-Verzeichnisses ohne Verzeichnisanteil, z.B. '.storage'.

Options

-extensions => \@extensions Liste der Datei-Erweiterungen der

Dateien, die der ContentProcessor verarbeitet. Hinzu kommen die Erweiterungen, die die per registerType() hinzugefügten Entitäts-Typen definieren. Die Extension wird ohne Punkt angegeben.

-init => $bool (Default: 0)

Erzeuge und initialisiere Storage.

-verbosity => 0|1|2 (Default: 1)

Umfang der Laufzeit-Meldungen.

Returns

ContentProcessor-Objekt

Plugins

registerType() - Registriere Entitäts-Typ

Synopsis

    $cop->registerType($pluginClass,$extension,$sectionType,@keyVal);
    $cop->registerType($pluginClass,$extension); # universelles Plugin

Description

Registriere Plugin-Klasse $pluginClass für Abschnitts-Objekte mit Identifier $sectionType und den Eigenschaften @keyVal. Die Plugin-Klasse wird automatisch geladen, falls sie noch nicht vorhanden ist (sie kann für Tests also auch "inline" definiert werden).

Die Plugin-Definition wird intern auf einem Hash-Objekt gespeichert, das vom ContentProcessor mit den instantiierten Entitten verknüpft wird.

Ein Universelles Plugin kann definiert werden, indem nur $pluginClass und $extension angegeben werden. An diese Plugin-Klasse werden alle (Haupt-)Abschnitts-Objekte delegiert, für die kein Plugin definiert ist. Logischerweise kann es höchstens ein Universelles Plugin geben. Für ein Universelles Plugin findet keine Attribut-Validierung in der der Basisklassenmethode create() statt.

Arguments

$pluginClass

Name der Plugin-Klasse, z.B. 'Program::Shell'.

$extension

Datei-Erweiterung für Dateien dieses Typs, ohne Punkt, z.B. 'prg'.

$sectionType

Abschnitts-Bezeichner ohne Klammerung, z.B. 'Program'.

@keyVal

Abschnitts-Attribute, die über den Abschnitts-Bezeichner hinaus den Dateityp kennzeichnen, z.B. Language=>'Shell'.

Returns

nichts

Operationen

commit() - Übertrage Veränderungen in den Storage

Synopsis

    $cop = $cop->commit;

Description

Vergleiche die Entitäten gegen den Storage und übertrage die Veränderungen dorthin. Geänderte Entitäten werden in der in der Datenbank als geändert gekennzeichnet.

Returns

ContentProcessor-Objekt (für Method-Chaining)

generate() - Generiere Ausgabe-Dateien

Synopsis

    $cop = $cop->generate($dir);

Description

Generiere in Zielverzeichnis $dir die Ausgabe-Dateien aller Entitäten.

Returns

ContentProcessor-Objekt (für Method-Chaining)

load() - Lade Entitäts-Definitionen

Synopsis

    $cop = $cop->load;
    $cop = $cop->load(@paths);

Description

Lade die Entitäts-Dateien der Pfade @paths. Ist @path leer, also kein Path angegeben, werden die Entitäts-Dateien aus dem Storage geladen.

Die Methode kann beliebig oft aufgerufen werden, aber nur der erste Aufruf lädt, alle weiteren Aufrufe sind Null-Operationen.

Arguments

@paths

Liste der Verzeichnisse und Dateien. Pfad '-' bedeutet STDIN.

Returns

ContentProcessor-Objekt (für Method-Chaining)

fetch() - Erzeuge Verzeichnisstruktur mit Entitäts-Definitionen

Synopsis

    $cop = $cop->fetch($dir,$layout);

Description

Übertrage alle Entitäts-Definitionen in Verzeichnis $dir (oder STDOUT, s.u.) gemäß dem Layout $layout. Per Differenzbildung wird dabei ein konsistenter Stand hergestellt. Existiert Verzeichnis $dir nicht, wird es angelegt. Andernfalls wird eine Rückfrage gestellt, ob das Verzeichnis überschrieben werden soll (siehe auch Option --overwrite).

Wird als Verzeichnis ein Bindestrich (-) angegeben, werden die Daten nach STDOUT geschrieben.

Die Methode bezieht die zu schreibenden Dateien von der Methode "fetchFiles"(), an die der Parameter $layout weiter gereicht wird. Die Methode kann in abgeleiteten Klassen überschrieben werden, um andere Strukturen zu generieren.

Arguments

$dir

Verzeichnis, in das die Entitäts-Definitionen kopiert werden.

$layout

Bezeichnung für das Verzeichnis-Layout. Wird von der von fetchFiles() der Basisklasse nicht genutzt und daher hier nicht dokumentiert. Siehe Dokumentation bei den Subklassen.

Options

-overwrite => $bool (Default: 0)

Stelle keine Rückfrage, wenn Verzeichnis $dir bereits existiert.

Returns

ContentProcessor-Objekt (für Method-Chaining)

test() - Teste geänderten Code

Synopsis

    $cop = $cop->test;

Returns

ContentProcessor-Objekt (für Method-Chaining)

Entitäten

entities() - Liefere Entities

Synopsis

    @entities | $entityA = $cop->entities;
    @entities | $entityA = $cop->entities($type);

Description

Liefere die Liste aller geladenen Entities oder aller geladenen Entities vom Typ $type. Bei der Abfrage der Entities eines Typs werden die Entities nach Name sortiert geliefert.

Arguments

$type

Abschnitts-Typ.

Returns

Liste von Entitäten. Im Skalarkontext eine Referenz auf die Liste.

Dateien

fetchFiles() - Liste der Dateien für fetch

Synopsis

    @files = $cop->fetchFiles;
    @files = $cop->fetchFiles($layout);

Description

Liefere die Liste der Dateien, die von der Methode "fetch"() geschrieben werden. Jede Datei wird durch ein zweielementiges Array repräsentiert, bestehend aus einem Datei-Pfad und dem Datei-Inhalt. Der Datei-Inhalt kann als String oder String-Referenz angegeben sein.

Diese (Basisklassen-)Methode liefert für jede Entität die Datei-Definiton

    [$ent->entityFile, $ent->sourceRef]

Damit erzeugt die Methode fetch() die gleiche Struktur wie der ContentProcessor im Storage-Verzeichnis def.

Die Methode kann in abgeleiteten Klassen überschrieben werden, um die Verzeichnisstruktur zu ändern und/oder den Inhalt der Dateien anders zusammenzustellen (z.B. mehrere Entity-Definitionen in einer Datei zusammenzufassen). In abgeleiteten Klassen können verschiedene Layouts können durch das Argument $layout unterschieden werden.

Returns

Array mit zweielementigen Arrays

Statistik

info() - Informationszeile

Synopsis

    $str = $cop->info;

Description

Liefere eine Informationszeile mit statistischen Informationen, die am Ende der Verarbeitung ausgegeben werden kann.

Returns

Zeichenkette

Intern

entityTypes() - Liste der Abschnitts-Typen

Synopsis

    @types | $typeA = $cop->entityTypes;

Description

Liefere die Liste der Abschnitts-Typen, die per registerType() registriert wurden.

Returns

Liste von Abschnitts-Typen. Im Skalarkontext eine Referenz auf die Liste.

extensionRegex() - Regex zum Auffinden von Eingabe-Dateien

Synopsis

    $regex = $cop->extensionRegex;

Description

Liefere den regulären Ausdruck, der die Dateinamen matcht, die vom ContentProcessor verarbeitet werden. Der Regex wird genutzt, wenn ein Verzeichnis nach Eingabe-Dateien durchsucht wird.

Returns

kopilierter Regex

findFiles() - Finde ContentProcessor-Dateien in Verzeichnis

Synopsis

    @files | $fileA = $cop->findFiles($dir);

Arguments

$dir

Das Verzeichnis, das nach Dateien durchsucht wird

Returns

Liste der Datei-Pfade. Im Skalarkontext eine Referenz auf die Liste.

msg() - Gib Information aus

Synopsis

    $cop->msg($level,$msg);

Arguments

$msg

Text, der ausgegeben werden soll.

Returns

nichts

plugin() - Ermittele Plugin zu Abschnitts-Objekt

Synopsis

    $plg = $cop->plugin($sec);

Description

Ermittele das Plugin zu Abschnitts-Objekt $sec. Existiert kein Plugin zu dem Abschnitts-Objekt, liefere undef.

Arguments

$sec

Abschnitts-Objekt

Returns

Plugin-Objekt

state() - Liefere/Setze persistenten Entitäts-Status

Synopsis

    $state = $cop->state($ent);
    $state = $cop->state($ent,$state);

Description

Liefere/Setze den persistenten Status der Entität $ent. Der Entitäts-Status ist persistent und bleibt daher über Programmaufrufe hinweg erhalten.

Eine Entität besitzt einen von vier Status:

0

Nichts zu tun. Die Entität wurde nicht geändert.

1

Die Entitäts-Datei wurde geändert. Die Ausgabe-Dateien der Entität müssen neu generiert werden.

2

Der Code der Entität hat sich geändert. Die Entität und alle abhängigen Entitäten müssen getestet werden.

3

Nur die Entität selbst muss getestet werden. Die Entität selbst wurde nicht geändert, hängt aber von einer Entität ab, die geändert wurde, oder ihre Testdateien oder Testdaten wurden geändert, was keinen Test der abhängigen Entitäten erfordert.

Ohne Parameter aufgerufen, liefert die Methode den aktuellen Zustand der Entität. Mit Parameter gerufen, setzt die Methode den Zustand, wobei dieser persistent gespeichert wird.

stateDb() - Persistenter Hash für Entitäts-Status

Synopsis

    $h = $cop->stateDb;

Description

Liefere eine Referenz auf den persistenten Hash, der den Status von Entitäten speichert.

storage() - Pfad zum oder innerhalb des Storage

Synopsis

    $path = $cop->storage;
    $path = $cop->storage($subPath);

Description

Liefere den Pfad des Storage, ggf. ergänzt um den Sub-Pfad $subPath.

Arguments

$subPath

Ein Sub-Pfad innerhalb des Storage.

Returns

Pfad

VERSION

1.098

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2016 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

3 POD Errors

The following errors were encountered while parsing the POD:

Around line 1129:

Expected text after =item, not a number

Around line 1134:

Expected text after =item, not a number

Around line 1139:

Expected text after =item, not a number