Template Language for Data Generator – BA14_meea_3 – Einleitung



Template Language for Data Generator – BA14_meea_3 – Einleitung

0 0


ba-presentation


On Github heinzelmannchen / ba-presentation

Template Language for Data Generator

BA14_meea_3

Christoph Hermann & Sebastian Sprenger

Traktanden

  • Einleitung
  • Theoretische Grundlagen
  • Vorgehen
  • Resultate
  • Ausblick
  • Demonstration

Einleitung

  • Ausgangslage
  • Anforderungen

Kaden & Partner AG

Ausgangslage

  • kleines Team von Entwicklern
  • RIA- , GIS-Anwendungen

Voodoo

Ausgangslage

"JUST A HACK FOR STOEFFEL FOR NOW, WILL BE MADE MUCH NICER IN THE FUTURE"
  • entwickelt von KP 2010
  • php-script
  • teil von GAIA

Voodoo

Ausgangslage

  • - schwer erweiterbar
  • - abhängig von GAIA
  • - Scafolding
  • - Verwaltung

Anforderungen

  • Generieren von Sourcefiles
  • Daten aus DB-Schema
  • einfache Konfiguration
  • erweiterbar, strukturiert, getestet
stoeffel

Theoretische Grundlagen

sebi

Nodejs

  • JavaScript Runtime basierend auf V8
  • Modularisiert
  • Packagemanager

Callbacks

doSomething(function(error) {
    if (error) {
        //...
    } else {
        doSomethingElse(function(error) {
            if (error) {
                //...
            } else {
                doSomethingElse2(function(error) {
                    if (error) {
                        //...
                    } else {
                        //...
                    }
                });
            }
        });
    }
});

Promises Zustände

  • pending: noch nicht abgearbeitet -> Weiterverarbeitung des Resultats warten
  • fulfilled: Die Verarbeitung erfolgreich. Auf dem Promise Objekt wird nun die then Funktion mit dem übergebenen Resultat ausgeführt.
  • rejected:Fehler -> die fail Funktion mit dem erhaltenen Fehler wird aufgerufen.

Promises

function doSomething() { ... }
    .then(doSomethingElse)
    .then(doSomethingElse2)
    .fail(onFail);
  • Statt Resultat gibt jede Funktion eine Promise zurück
  • then Funktion gibt Promise zurück -> chaining
  • Bestrebung Promises als Firstclass Objekte in den nächsten Standard von JavaScript (ES6) zu implementieren
  • Unsere Module sind Promise based
  • Kommunikation innerhalb der Module ebenfalls mit Promises

Vorgehen

sebi

Planung

  • User Stories
  • kurze Sprints, kleine Releases, 2 Wochen
  • Rollen
    • Product Owner
    • Scrummaster
Product Owner: kannte Vorgänger, angestellt, Verhalten der Appliaktion, Scrummaster: Sprintreviews, (dailystandups), Sprintgoals/tasks

Management

GitHub

Burn Down Chart

Design

  • Template Engine
    • Eigener Code
    • JavaScript
    • Delimiter
    • Integration
  • Konfiguration
    • Yeoman
    • Grunt
    • npm
    • bower
Template: Eigener Code, JavaScript, Delimiter, Vorkompilation, Integrierung Konfiguration: Yeoman (keine Config), Grunt (JavaScript/CoffeeScript), npm (package.json simple/strukturiert/cli), bower

Programmierung

  • Collective Code Ownership
  • Pair Programming
  • TDD
Coding Standard, JSHint, Pair Programming, Code Reviews Komponententests, TDD, Red Green Refactor (Kent Beck), should-Assertion Style

Continuous Integration

Open Source

  • auf GitHub, public
  • Organisation
  • MIT Lizenz
Kommerziell nutzbar, Änderungen erlaubt, Distribution erlaubt, Private Nutzung. Autor nicht haftbar.

Resultate

Architektur

Template

class <%= className %> {
  <% _.each(attributes, function(attribute) { %>
  public <%= attribute.type %> <%= attribute.name %>;
  <% }) %>
}
{
    "className": "Person",
    "attributes": [{
      "name": "name",
      "type": "string"
    }, {
      "name": "age",
      "type": "int"
    }]
}
class Person {
  public string name;
  public int age;
}

Konfiguration

  • .heinzelrc
{
    "domains": {
    },
    "generators": {
    },
    "templates": {
    },
    "customScript": "./templates/customScripts/index.js"
}

Domains

Konfiguration

  • .heinzelrc
"domains": {
        "data": {
            "version": "1.0.1"
        },
        "generator": {
        },
        "extjs": {
            "model": {
            }
        },
        "backend": {
            "entity": {
                "template": "./templates/backend/Entity.php.tpl",
                "output": "./webroot/backend/Entity/<%= modelName %>.php"
            },
            "controller": {
            }
        }
    },
}

CLI

$ heinzel
[?] What would you like me to do today? (Use arrow keys)
❯ create domains
  initialize the .heinzelrc
  list domains, templates and generators
  explain datastructure returned by generator
  install templates and generators
  uninstall templates and generators
  update templates and generators
  search templates and generators in the npm registry
$ heinzel create backend.entity --override

Ausblick

Einsatz bei Kaden & Partner AG

  • Allgemein verwendbare Templates
  • Postgresql (code first)
  • Workshop
  • Scaffolding für neue Anwendung
stoeffel

Geplante Features

  • Post Actions
  • Daten von Generator speichern (json)
  • weitere Generatoren (xml, json, ...)
  • Webauftritt
stoeffel

Demonstration

  • Initialisieren
  • Erstellen eines Templates
  • Erstellen eines Generators
  • Heinzelmännchen @Kaden & Partner AG
  • initialisieren (stoeffel heinzel init node-module)
  • erstellen eines Templates (stoeffel erstellen eines templates für tests)
  • erstellen eines Generators (sebi erstellen eines generators fstree)
  • Heinzelmännchen @Kaden & Partner AG (stoeffel templates für OrgVz)

Fragen

Backup

Promises erzeugen

function doSomethingAsPromise() {
    var q = Q.defer(),
        result;
    ...
    q.resolve(result);
    return q.promise;
}

doSomethingAsPromise().then(function calledWhenResolved(result) {
    console.log(result);
});

Sprints

Sprint Laufzeit Ziel 1 17.02.-03.03. Infrastruktur, Projektmanagement definieren, erste Funktionalität, Coding Standards 2 03.03.-24.03. Daten anhand des Informationsschemas einer Datenbank generieren 3 24.03.-03.04. Konfiguration, pg2json, usage guide 4 03.04.-28.04. Dokumentation, pg2json abschliessen, gen-pg/template/config zusammensetzen 5 28.04.-19.05. CLI, Filter, Update, Explain, Bugixes, Dokumentation 6 19.05.-06.06. Dokumentation, Bugfixes

MIT License

The MIT License (MIT)

Unittest

describe('Template', function() {
    describe('#process', function() {
        it('should process the template', function() {
            var template = '<%= heinzel %>',
                data = {
                    heinzel: 'Berti'
                };

            return heinzelTemplate.process(template, data).should.become('Berti');
        });
    });
});