Alessio Biancalana Grab The Blaster di Alessio Biancalana

Burst 1.0.0 e una notte insonne in aeroporto: arrivano i customs

Ho ripreso in mano Burst, che era tanto che non toccavo (come era tantissimo che non toccavo una riga di Ruby), ovvero il mio generatore di front-matter YAML per Jekyll, e ho cominciato a scrivere del codice nuovo per introdurre una feature che avevo buttato nel dimenticatoio.

Per prima cosa ho introdotto un file di configurazione, situato nella home dell’utente, in formato JSON, chiamato .burstrc. Successivamente, oltre ad inserire la possibilità di inserire un titolo di default per i post, ho cominciato a scrivere il codice per implementare una sorta di comportamento configurabile all’amatriciana.

Customs to the rescue!

Ho deciso di chiamare questi “cosi” customs, dato che sono a tutti gli effetti dei formati custom per il front-matter YAML di Jekyll. Il file di configurazione ha questa faccia:

{
  "defaultTitle": "This is a default title",
  "customs": {
    "link": {
      "replaces": {
        "layout": "link"
      },
      "adds": {
        "origlink": "http://dottorblaster.it"
      }
    },
    "foo": {
      "replaces": {
        "layout": "bar"
      },
      "adds": {
        "custom_field": "meh"
      }
    }
  }
}

È tutto un po’ verboso, ma efficace. La sezione del JSON in questione relativa per esempio al layout custom chiamato “link” mi permette di creare uno YAML al volo sostituendo il contenuto della chiave “layout” e aggiungendo una chiave “origlink” con un link che poi andrò a modificare. In pratica, con un meccanismo di questo tipo posso definire costantemente nuovi custom a seconda di quello che mi serve andando ad indicare un nome per il mio custom, cosa aggiungere, e cosa modificare del layout originale.

Il risultato finale è molto cool:

$ burst --custom link --title "You see customs here"

---
layout: link
status: publish
published: true
title: You see customs here
origlink: http://dottorblaster.it
date: 2016-08-15 18:10:58 +0200
categories:
- Category
tags:
- first_tag
- second_tag
---

Eh ma oggi è ferragosto, ci hai messo troppo

Vero. Ma ho anche imbellettato un po’ tutto con un po’ di colori :-) E ho anche rifattorizzato leggermente la classe che gestisce i customs (anche se c’è una cosa che non mi piace per niente…). Il prossimo passo è suddividere in più classi tutto quanto quello c’è nel burst.rb. E poi che diamine, mica potevo finire tutto subito: avevo da scrivere ferragosto ;-)

Note interessanti

Sviluppando i customs mi sono capitati un paio di episodi di “incriccamento”, ossia episodi durante i quali non sapevo andare avanti e avevo la sensazione di essermi incartato in qualcosa di troppo complicato.

Il primo è sicuramente dovuto al fatto che non avevo idea di come implementare il file di configurazione e di cosa scriverci dentro per facilitarmi la vita senza essere troppo d’intralcio al futuro me che dovrà solo usare questa roba (o magari altre persone). La soluzione è stata cominciare a scrivere di getto un JSON senza pensarci troppo e usandolo come una scatola delle sorprese, mettendoci dentro tutto quello che mi sarebbe piaciuto di più avere come un parametro configurabile.

Il secondo caso è stato più difficile da risolvere in modo elegante e devo solo ringraziare che l’aeroporto fosse vuoto per aver potuto concentrarmi a sufficienza. Nonostante il letame che ho lasciato sparso e che dovrei pulire, ho adottato un approccio funzionale per la mia classettina CustomsHandler che mi ha consentito come ultimo benefit di effettuare una combinazione di funzioni in un wrapper che ho usato come entrypoint per popolare tutto il cucuzzaro.

In entrambi i casi, è stato apprezzabile avere affianco la mia Moleskine.

Sono discretamente soddisfatto, è stato un bell’esercizio che oltre a farmi sorridere mi ha anche consentito di sopravvivere ad una notte insonne in aeroporto senza troppi effetti collaterali (a parte una grossa dormita una volta arrivato a destinazione).

Adesso devo solo documentare tutto nel README 8-)

comments powered by Disqus

Member of

Previous Random Next