2014-12-03 8 views
12

Obiettivo:Trattare l'uso di @author come violazione stile di codice

emettere un avviso nel caso in cui un tag @author viene utilizzato ovunque all'interno dei file .js nel progetto.

Domanda:

E 'qualcosa che jshint o altri strumenti di controllo statica del codice può aiutare con? In caso contrario, quali opzioni ho?

Descrizione:

Sono completamente d'accordo con la risposta di Paolo a Javadoc @author tag good practices filo e trattare @author tag come un rumore inutile.

E, nel mondo Python, ho visto persone controllare l'utilizzo del tag. Ad esempio, lo stato Openstack Style Guidelines in modo esplicito non utilizza il tag @author. Essi hanno sviluppato una serie di controlli personalizzati flake8 che comprendono:

[H105] Don’t use author tags. 

Ora, sto cercando di risolvere lo stesso problema in JavaScript.

Esempio (questo non dovrebbe passare un controllo di qualità del codice):

/** 
* @author John Smith <[email protected]> 
*/ 

'use strict'; 
+1

No, jshint non può farlo. Basta fare un grep attraverso i sorgenti alla ricerca di '@ author'. Se vuoi puoi metterlo in un hook di pre-commit git. Oppure, potresti hackerare JSDoc in errore quando crei documenti se incontra '@ autore'. –

+0

@torazaburo grazie per l'utile commento, in realtà può essere una risposta legittima. – alecxe

risposta

7

No, jshint non può farlo. Basta fare un grep attraverso i sorgenti alla ricerca di @author. Se vuoi puoi metterlo in un hook di pre-commit git. Oppure, potresti hackerare JSDoc in errore quando crei documenti se incontra @author.

5

Scusa, volevo provarlo prima di pubblicare una risposta, ma la taglia è quasi finita. ; ^)

This answer afferma che esiste un modo per scrivere il proprio modulo JSHint.

Facciamo finta che funziona come pubblicizzato ed è stata fusa nel.

Great instructions here, però notare che questi sono sul sito "jshint-next".

il codice di esempio da quella pagina:

// This module errs on any identifier that doesn't starts with 'kitty'. 
function myModule(linter) { 
    linter.on("Identifier", function (ident) { 
    if (ident.name && ident.name.slice(0, 5) !== "kitty") 
     linter.report.addError("C001", "More cats please."); 
    }); 
} 

Ecco dal tratto iniziale su come impostare un linter:

var Linter = require("jshint").Linter; 
var code = "<your beautiful JavaScript code here>"; 

// Create a new instance of Linter. 
var linter = new Linter(code); 

// Now you can teach JSHint about your predefined variables. 
// Note that default JavaScript identifiers are already there. 
linter.addGlobals({ 
    jQuery: false, 
    MyPlugin: true 
}); 

// If you have any JSHint extensions, you can attach them 
// to the current instance. 
linter.addModule(myModule); 

// Finally, parse your code. 
linter.parse(); 

mi rendo conto che è abbastanza generico (si sarebbe ancora bisogno di ricerca linter.on opzioni oltre Identifier, c'è anche un String, ad esempio), ma sembra piuttosto promettente.Di nuovo, puoi vedere come integrare usando le istruzioni above. E sembra che questo sia il formato used in style.js.

Ho provato il non. Non ho avuto tempo a casa; scuse.

Esiste un motivo specifico per cui la risposta di "solo grep" di torazaburo non funziona? Ti serve questo per far parte di un flusso di lavoro di qualità del codice? Se è così, questo "scrivi il tuo modulo" sembra essere la strada da percorrere.

Ci sono anche dei modi abbastanza ovvi per hackerare JSLint, se ne hai voglia, ma non sono sicuro che Crockford lo apprezzerebbe. ; ^)

+0

Ha, ovviamente la taglia è stata assegnata * come * Sto scrivendo questa risposta. Questo è quello che ottengo. – ruffin

+0

:) Non ti preoccupare - ci proverò e tornerò da te. Grazie mille. (fuori dai voti per oggi, ma questo sicuramente merita uno) – alecxe

+0

FYI, ho pubblicato come ho risolto con 'ESLint' (notare la semplicità). Bounty va da te comunque. Grazie per aver esaminato questo. – alecxe

4

Risolto il problema con ESLint package - un'utilità di sfilacciamento per JavaScript.

Creato un custom rule (nota quanto sia semplice) e salvati a rules/no-author.js:

/** 
* @fileoverview A rule to disallow @author tag in code 
*/ 

module.exports = function (context) { 
    "use strict"; 
    function checkComment(node) { 
     var commentToCheck = node.value.toLowerCase().trim(); 

     if (commentToCheck.indexOf("@author") !== -1) { 
      context.report(node, "A comment unexpectedly contains @author."); 
     } 
    } 

    return { 
     "BlockComment": checkComment, 
     "LineComment": checkComment 
    }; 
}; 

Ora, immaginate Ho un file test.js che viola l'uso di @author tag:

/** 
* @author John Smith <[email protected]> 
*/ 

E vedere come viene applicata la regola:

$ eslint test.js --rulesdir=rules/ --rule='no-author: 2' 

test.js 
    1:0 error A comment unexpectedly contains @author no-author 

✖ 1 problem 

FYI, no-author: 2 qui means per attivare la regola come errore (il codice di uscita è 1 quando attivato).

Problemi correlati