Documentação em código

.. autores::

   :autor: "Miguel Costa"

Documentation in Django

... and everywhere else

 

Author: Carlos Batman

Writing is nature's way of exposing how sloppy your thinking is.

- Guindon, via MPJ

Documentação em Django - #dontjustcode

documentação 

  • Requisitos (formalização de necessidades)
  • Arquitetura/Design (ideias gerais e planeamento)
  • Técnica (código, API...)
  • Para utilizadores (guias...)
  • Marketing (This Sunday Sunday Sunday!)

fonte: https://en.wikipedia.org/wiki/Software_documentation (yeah, I know...)

Documentação em Django - #dontjustcode

Deveriam programadores documentar?

 

 

 

Só o que é deles!

Documentação em Django - #dontjustcode

Porquê (do)cumentar Código ?

Um exemplo

Being able to write about your code shows that you really understand how it works.

- QDeltaE, via Codepen

Documentação em Django - #dontjustcode

function a(b) {
    return Math.floor(Math.random()*b)
 }

function c(d, e) {
    let f; 
      
    do {
      f = a(d);
    } while(f === e)

    return f;
}

// caso de uso
c(1000, 3)
  • Que faz?
  • Porque fiz isto?
  • Como uso?
  • O que esperar?
  • Está em que estado?
  • Autor? Versão?

A minha biblioteca para gerar números!

Documentação em Django - #dontjustcode

// LOOK MA, I'M SELF-DOCUMENTED!

function getRandomInteger(maximumInteger) {
    return Math.floor(Math.random()*maximumInteger)
 }

function getRandomIntegerWithException(maximumInteger, exceptionInteger) {
    let outputInteger; 
    
    // run the random number function
    // as long as the output is the same
    // as the exception  
    do {
      outputInteger = getRandomInteger(maximumInteger);
    } while(exceptionInteger === outputInteger)

    return outputInteger;
}

// caso de uso
getRandomNumberExcept(1000, 3)

 

Há restrições?

A minha AUTODOCUMENTADA biblioteca!

'com exceção?'

Porque preciso disto?

Documentação em Django - #dontjustcode

/**
 * Returns a random INTEGER POSITIVE number that will not
 * be larger than a specific number.
 * 
 * This method is convenient for generating a random index for a list
 * given the width as parameter 
 *
 * @param  {Number} maximumInteger A positive number that sets the maximum value
 * @return {Number}                A random positive not exceeding maximumNumber
 * 
 * @todo Throw an error in case maximumInteger is NOT a positive number
 * 
 * @example
 * // get a random integer up to 10
 * getRandomInteger(10)
*/
function getRandomInteger(maximumInteger)

A minha DESCRITA biblioteca para gerar números!

Documentação em Django - #dontjustcode

/**
 * Returns a random positive integer provided a maximum integer.
 * If set, the random positive number will be different from an 
 * exception set as a parameter.
 *
 * This can be used to ensure that a random number will not generate
 * a number that was generated before and/or is not a desired value.
 *
 * This function uses {@link getRandomInteger}.
 * 
 * @example
 * // generate a random number up to 10, but not including 3
 * getRandomIntegerWithException(10, 3)
 * @param  {Number} maximumInteger   A positive number that sets the maximum value
 * @param  {Number} [exceptionInteger] [description]
 * @return {Number}                  [description]
 */
function getRandomIntegerWithException(maximumInteger, exceptionInteger)

A minha DESCRITA biblioteca para gerar números!

Documentação em Django - #dontjustcode

comentários descritivos

  • Descrevem a função/bloco e seus parâmetros
  • São destinados a programadores (incluindo o próprio)
    • 'Vivem' com o código-fonte
  • Descrevem 'o quê' e 'porquê'
  • Existem 'standards' para várias linguagens

Documentação em Django - #dontjustcode

Comentário descritivo em Javascript em formato JSDocs (via DoxyDoxygen)
 

comentários descritivos

Documentação em Django - #dontjustcode

Vantagens?

No que estava eu a pensar quando fiz isto?!

 

  • obriga a reorganizar ideias e justificar abordagens (planeamento)
    • será mesmo disto que preciso?
  • passa o testemunho
    • para ti e os outros
  • facilita criação de outros tipos de documentação
    • manual e automática
  • evita ler código-fonte e a reportar bugs
  • ajuda a planear testes

Templates em Django - Django4FrontEnd

Coding explains 'how' and commenting explains you 'why' - Bisileesh P.B

... and testing proves that the 'how' works! - Me

But the pre-emptively badass code you are writing with that goal is even more likely to become a thorn in someone’s side. Whose? The next unlucky person who has to comprehend your code, which may even be yourself.

- Kevin Bloch, via Toptal

Documentação em Django - #dontjustcode

Documentação em Django - #dontjustcode

do-comentar

Documentação técnica a partir de comentários descritivos de funções, métodos e classes.

(Ainda sobre comentários descritivos)

Documentação em Django - #dontjustcode

do-comentar

  • O quê
    • Funcionalidade e parâmetros
    • Avisos, TODO
  • Porquê/Para quê
    • breve contexto
  • Como utilizar
    • exemplos
  • ​Meta (autor...)
  • Como funciona o algoritmo 
    • a menos que muito generalizado

Descreve

Não descreve

Documentação em Django - #dontjustcode

do-comentar

Porquê ter um padrão para do-comentar código?

  • Estrutura comum e uniforme melhora comunicação

 

Compilação automática da documentação em 'manuais'

Documentar módulos em Python e django?

Convenções

  • Docstring
  • reStructuredText (para sphinx)
def get_data_from_something(id):
    """
    This is a helper function for views.

    Gets the seo data corresponding to an instance of :class:`app.models.Something` with a specific id string
    The returned object contains:

    * title
    * description
    * a list of keywords
    
    :param      id:  A string containing the identifier value of the requested object
    :type       id:  string
    
    :returns:   A dictionary containing the a title string, a description string and a list of keyword.
    :rtype:     dictionary

    .. todo::
       Set an error in case there is no SEOPage instance requested

    .. note::
       It is not clear why this is not a manager or model method

    :Example:

    >>> # returns seo-related data for the page with 'home' urlname
    >>> get_seo_data("home")

    
    """

Documentação em Django - #dontjustcode

Exemplo

Sumário muito resumido

Descrição mais detalhada (depois de linha de intervalo)

Diretivas (notas com formatação específica para documentação em Sphinx)

class IFrameTag(InclusionTag):
    """
    Renders an IFrame HTML element that can either be included directly or through a block component.
    
    Its options can be set via the :class:`templatetags.IFrameTagForm` form.
    
    :Example:
    
    .. code-block:: html

       {% iframe src='//slides.com/costaman/djadefdoc/embed' width=500 height=400 %}
       <!-- will output -->
       <iframe src='//slides.com/costaman/djadefdoc/embed' width='500' height='400' frameborder='0'></iframe>

    """
    # ... actual code

Documentação em Django - #dontjustcode

Exemplo (Classe)

"code block" dentro de exemplo

linha em branco é importante!

Muito difícil?

Tooling

  • Suporte por defeito em PyCharm
  • Extensões que facilitam:

Documentação em Django - #dontjustcode

Gerar  documentação

com sphinx

  1. Iniciar projeto
  2. Criar páginas
  3. Aproveitar comentários!

Templates em Django - Django4FrontEnd

fonte: http://stackoverflow.com/questions/9846242/setting-up-django-settings-for-sphinx-documentation

Montagem - prÉ-DJANGO 1.9

  1. Instalar 'sphinx'
  2. Inicializar 'projeto'
    1. Não esquecer o 'automodule'
  3. Adicionar pasta de projeto (id. módulos)
  4. MAKE
pip install sphinx
sphinx-quickstart
make html
# docs/source/conf.py
# caminho relativo desde este ficheiro
# deve apanhar apps
import os
import sys
from django.conf import settings
# caminho para o projeto
# sys.path.insert(0, os.path.abspath('..'))
sys.path.insert(0, os.path.abspath('../..'))

# ou seja lá qual for o ficheiro...
# os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

só se não estiver definido em ambiente

assume 'project/_docs/source'

Templates em Django - Django4FrontEnd

fonte: http://stackoverflow.com/questions/9846242/setting-up-django-settings-for-sphinx-documentation

Montagem - DJANGO 1.9+

  1. Instalar 'sphinx'
  2. Inicializar 'projeto'
    1. Não esquecer o 'automodule'
  3. Adicionar pasta de projeto (id. módulos)
  4. MAKE
pip install sphinx
sphinx-quickstart
make html
# docs/source/conf.py

import os
import sys
import django
# caminho para o projeto
# sys.path.insert(0, os.path.abspath('..'))
sys.path.insert(0, os.path.abspath('../..'))

# ou seja lá qual for o ficheiro...
# os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

django.setup()

só se não estiver definido em ambiente

assume 'project/_docs/source'

IMPORTANTE (automodule)

Templates em Django - Django4FrontEnd

Extensões úteis

Sphinx RTD - tema estilo 'Read the docs'

e agora é escrever!

 

 

 

como escrever páginas?

RST - Títulos e Texto

Título 1
========

É favor respeitar o número de traços por baixo do título.

Texto *itálico* **negrito** e .

Subtítulo
---------

Não existe padrão para sublinhados para *headings*.
O primeiro é para títulos1, segundo para títulos 2

.. warning::
   Isto é um aviso

.. todo::
   Isto é um todo!

Título 1
--------

É favor respeitar o número de traços por baixo do título.

Texto *itálico* **negrito** e .

Subtítulo
=========

Não existe padrão para sublinhados para *headings*.
O primeiro é para títulos1, segundo para títulos 2

.. warning::
   Isto é um aviso

.. todo::
   Isto é um todo!

Esquerda == Direita, mesmo usando diferentes sublinados para níveis de título

RST - listas, etc.

Lista desordenada
=================

* Item 1
* Item 2

Lista Ordenada
==============

1. Item 1
2. Item 2

Ou...

# Item 1
# Item 2

RST - Referências

.. _pagina1:

Página 1
--------

Podemos fazer uma referência a :ref:`pagina2`.
Aquele comentário ali em cima com o underscore? 
É uma etiqueta (para se poder referenciar a página).


.. _pagina2:

Página 2
--------

Podemos fazer uma referência a :ref:`pagina1`.
Aquele comentário ali em cima com o underscore?
É uma etiqueta (para se poder referenciar a página).

Referências a código

Para referenciar funções, classes ou módulos, 
pode-se usar caminhos absolutos ou relativos! 


Podes ver mais na função :func:`main_app.my_functions.function`, 
assim como a classe :class:`main_app.models.EstaClasse`.

Também existe `mod` para... módulos!

.. no proprio ficheiro, para fazer uma ref. a uma func. local

A função local :func:`do_stuff`.


referência única

vai para...

aparece...

.. links

Isto tem `um link externo <http://www.linkpersonaizado.ya>`_ com o texto "um link externo"


Links

Diretivas

Documentação em Django - #dontjustcode

.. directive:: parameters
   :option1:
   :option2:

   Content

Espécie de funções para gerar conteúdo "especial", mas que suporta parâmetros e personalizações

3 espaços

(indentação)

Linha vazia antes do conteúdo

podem aparecer logo por baixo

customizações predefenidas

Diretivas

Documentação em Django - #dontjustcode

.. deprecated:: 1.1
   use something else. This function is old!

.. todo::
   Set a TODO here

.. note::
   Just a general note!

.. reference to another function, class or method

.. seealso:: 

   It's related to :class:`SomeClass`.

.. comentario
   ainda um comentario
   cuidado com a identação!
.. directive::
   parametros
   :option1:
   :option2:

   Content

Estrutura Base

parâmetro

não tem ::

# if this were a function...
note("Just a general note!")

Tabelas de conteúdo

Gerar tabela de conteúdo
------------------------

Podemos hiperligar aos índices a partir do *name*, 
tipo :ref:`indice`.

Sem subníveis e título 'Table of Content'
=========================================

.. toctree::
   :maxdepth:1
   :caption: Table of Content
   :name: indice

   pagina1
   pagina2


Documentação em Django - #dontjustcode

Gerar tabela de conteúdo
------------------------

Podemos hiperligar aos índices a partir do *name*, 
tipo :ref:`indice2`.

Até 1 subnível
==============

.. toctree::
   :maxdepth:1
   :name: indice2

   pagina1
   pagina2
   subpaginas/*

Geração automática

.. automodule:: app.file
   :members:

.. autoclass:: app.file.class
   :members:

Documentação em Django - #dontjustcode

Bibliografia

Documentação em Django - #dontjustcode

Documentação e Código

By Miguel Costa

Documentação e Código

- Motivações para documentar (e não documentar) código - As diferenças entre documentação de aplicações e de código - Bases do Sphinx e do RST

  • 527