Renderize arquivos leia-me locais antes de enviá-los para o GitHub.
Grip é um aplicativo de servidor de linha de comando escrito em Python que usa a API markdown do GitHub para renderizar um arquivo leia-me local. Os estilos e a renderização vêm diretamente do GitHub, então você saberá exatamente como eles aparecerão. As alterações feitas no Leiame serão refletidas instantaneamente no navegador sem a necessidade de atualização da página.
Às vezes, você só deseja ver o resultado exato do leia-me antes de enviar e enviar para o GitHub.
Especialmente ao fazer desenvolvimento orientado por Readme.
Para instalar o grip, basta:
$ pip install grip
No OS X, você também pode instalar com Homebrew:
$ brew install grip
Para renderizar o leia-me de um repositório:
$ cd myrepo
$ grip
* Running on http://localhost:6419/
Agora abra um navegador e visite http://localhost:6419. Ou execute -b
e o Grip abrirá uma nova guia do navegador para você.
Você também pode especificar uma porta:
$ grip 80
* Running on http://localhost:80/
Ou um arquivo explícito:
$ grip AUTHORS.md
* Running on http://localhost:6419/
Alternativamente, você pode simplesmente executar grip
e visitar localhost:6419/AUTHORS.md, pois o grip suporta URLs relativos.
Você pode combinar os exemplos anteriores. Ou especifique um nome de host em vez de uma porta. Ou forneça ambos.
$ grip AUTHORS.md 80
* Running on http://localhost:80/
$ grip CHANGES.md 0.0.0.0
* Running on http://0.0.0.0:6419/
$ grip . 0.0.0.0:80
* Running on http://0.0.0.0:80/
Você pode até ignorar o servidor e exportar para um único arquivo HTML, com todos os estilos e recursos incorporados:
$ grip --export
Exporting to README.html
Controle o nome da saída com o segundo argumento:
$ grip README.md --export index.html
Exporting to index.html
Se você estiver exportando vários arquivos, poderá impedir que os estilos sejam incorporados para economizar espaço com --no-inline
:
$ grip README.md --export --no-inline introduction.html
Exporting to introduction.html
A leitura e gravação de stdin e stdout também são suportadas, permitindo usar o Grip com outros programas:
$ cat README.md | grip -
* Running on http://localhost:6419/
$ grip AUTHORS.md --export - | bcat
$ cat README.md | grip --export - | less
Isso permite que você teste rapidamente a aparência das coisas inserindo Markdown diretamente em seu terminal:
$ grip -
Hello **world**!
^D
* Running on http://localhost:6419/
Nota: ^D
significa Ctrl+D
, que funciona no Linux e OS X. No Windows você terá que usar Ctrl+Z
.
A renderização como conteúdo do usuário, como comentários e problemas , também é suportada, com um contexto de repositório opcional para vincular aos problemas:
$ grip --user-content --context=joeyespo/grip
* Running on http://localhost:6419/
Para mais detalhes e opções adicionais, consulte a ajuda:
$ grip -h
O Grip se esforça para estar o mais próximo possível do GitHub. Para fazer isso, o grip usa a API Markdown do GitHub para que as alterações em seu mecanismo de renderização sejam refletidas imediatamente, sem exigir que você atualize o grip. No entanto, por causa disso, você pode atingir o limite de taxa horária da API. Se isso acontecer, o grip oferece uma maneira de acessar a API usando suas credenciais para desbloquear um limite de taxa muito mais alto.
$ grip --user < your-username > --pass < your-password >
Ou use um token de acesso pessoal com escopo vazio (observe que um token será necessário se sua conta GitHub estiver configurada com autenticação de dois fatores):
$ grip --pass < token >
Você pode persistir essas opções na sua configuração local. Por motivos de segurança, é altamente recomendável usar um token de acesso em vez de uma senha . (Você também pode manter sua senha segura configurando o Grip para obtê-la de um gerenciador de senhas.)
Há também uma ramificação em andamento para fornecer renderização offline . Uma vez que isso se assemelhe mais precisamente ao GitHub, ele será exposto na CLI e, em última análise, será usado como um mecanismo substituto perfeito para quando a API não puder ser acessada.
O Grip sempre acessa o GitHub por HTTPS, portanto, seu README e suas credenciais ficam protegidos.
Veja como outras pessoas da comunidade estão usando o Grip.
Quer compartilhar o seu próprio? Diga olá @joeyespo ou envie uma solicitação pull.
$ git clone https://github.com/YOUR_USERNAME/YOUR_REPOSITORY.wiki.git
$ cd YOUR_REPOSITORY.wiki
$ grip
Por Joshua Gourneau.
Entre no diretório:
$ cd YOUR_DIR
$ export GRIPURL= $( pwd )
Inclua todos os ativos definindo a variável de configuração CACHE_DIRECTORY
:
$ echo " CACHE_DIRECTORY = ' $( pwd ) /assets' " >> ~ /.grip/settings.py
Exporte todos os seus arquivos Markdown com Grip e substitua caminhos absolutos de ativos por caminhos relativos:
$ for f in * .md ; do grip --export $f --no-inline ; done
$ for f in * .html ; do sed -i ' ' " s? $GRIPURL /??g " $f ; done
Opcionalmente, você pode compactar o conjunto de arquivos HTML em docs.tgz
com:
$ tar -czvf docs.tgz ` ls | grep [ . ]html$ ` assets
Procurando uma solução multiplataforma? Aqui está um script Python equivalente.
Por Matthew R. Tanudjaja.
Para personalizar o Grip, crie ~/.grip/settings.py
e adicione uma ou mais das seguintes variáveis:
HOST
: O host a ser usado quando não for fornecido como argumento CLI, localhost
por padrãoPORT
: A porta a ser usada quando não fornecida como argumento CLI, 6419
por padrãoDEBUG
: Se deve usar o depurador do Flask quando ocorre um erro, False
por padrãoDEBUG_GRIP
: Imprime informações estendidas quando ocorre um erro, False
por padrãoAPI_URL
: URL base para a API do github, por exemplo, de uma instância do Github Enterprise. https://api.github.com
por padrãoCACHE_DIRECTORY
: O diretório, relativo a ~/.grip
, para colocar os ativos em cache (isso é executado através do seguinte filtro: CACHE_DIRECTORY.format(version=__version__)
), 'cache-{version}'
por padrãoAUTOREFRESH
: Se o conteúdo Leiame deve ser atualizado automaticamente quando o arquivo for alterado, True
por padrãoQUIET
: Não imprime informações estendidas, False
por padrãoSTYLE_URLS
: URLs adicionais que serão adicionados à página renderizada, []
por padrãoUSERNAME
: O nome de usuário a ser usado quando não fornecido como argumento CLI, None
por padrãoPASSWORD
: A senha ou token de acesso pessoal a ser usado quando não for fornecido como um argumento CLI ( por favor, não salve suas senhas aqui. Em vez disso, use um token de acesso ou insira este código e pegue sua senha de um gerenciador de senhas), None
por padrão Observe que este é um arquivo Python. Se você vir erros 'X' is not defined
, você pode ter esquecido algumas aspas. Por exemplo:
USERNAME = 'your-username'
PASSWORD = 'your-personal-access-token'
GRIPHOME
: Especifique um local alternativo settings.py
, ~/.grip
por padrãoGRIPURL
: A URL do servidor Grip, /__/grip
por padrão Este arquivo é um script Python normal, então você pode adicionar configurações mais avançadas.
Por exemplo, para ler uma configuração do ambiente e fornecer um valor padrão quando não estiver definido:
PORT = os . environ . get ( 'GRIP_PORT' , 8080 )
Você pode acessar a API diretamente com Python, usando-a em seus próprios projetos:
from grip import serve
serve ( port = 8080 )
* Running on http : // localhost : 8080 /
Execute main diretamente:
from grip import main
main ( argv = [ '-b' , '8080' ])
* Running on http : // localhost : 8080 /
Ou acesse o aplicativo Flask subjacente para obter ainda mais flexibilidade:
from grip import create_app
grip_app = create_app ( user_content = True )
# Use in your own app
Executa um servidor local e renderiza o arquivo Leiame localizado no path
quando visitado no navegador.
serve ( path = None , host = None , port = None , user_content = False , context = None , username = None , password = None , render_offline = False , render_wide = False , render_inline = False , api_url = None , title = None , autorefresh = True , browser = False , grip_class = None )
path
: O nome do arquivo a ser renderizado ou o diretório que contém seu arquivo Leiame, padronizando o diretório de trabalho atualhost
: O host para escutar, padronizando a variável de configuração HOSTport
: A porta para escutar, padronizando a variável de configuração PORTuser_content
: se deve renderizar um documento como conteúdo do usuário, como comentários ou problemas do usuáriocontext
: o contexto do projeto a ser usado quando user_content
for verdadeiro, que assume a forma de username/project
username
: o usuário a ser autenticado no GitHub para estender o limite da APIpassword
: a senha para autenticação no GitHub para estender o limite da APIrender_offline
: se deve renderizar localmente usando Python-Markdown (Nota: este é um trabalho em andamento)render_wide
: Se deve renderizar uma página larga, False
por padrão (isso não tem efeito quando usado com user_content
)render_inline
: Se os estilos devem ser incorporados no arquivo HTMLapi_url
: um URL base diferente para a API do github, por exemplo, o de uma instância do Github Enterprise. O padrão é a API pública https://api.github.com.title
: o título da página, derivado do path
por padrãoautorefresh
: atualiza automaticamente o conteúdo renderizado quando o arquivo Leiame é alterado, True
por padrãobrowser
: abre uma guia no navegador após o servidor iniciar., False
por padrãogrip_class
: Use uma classe Grip personalizada Grava o arquivo Leiame especificado em um arquivo HTML com estilos e recursos embutidos.
export ( path = None , user_content = False , context = None , username = None , password = None , render_offline = False , render_wide = False , render_inline = True , out_filename = None , api_url = None , title = None , quiet = None , theme = 'light' , grip_class = None )
path
: O nome do arquivo a ser renderizado ou o diretório que contém seu arquivo Leiame, padronizando o diretório de trabalho atualuser_content
: se deve renderizar um documento como conteúdo do usuário, como comentários ou problemas do usuáriocontext
: o contexto do projeto a ser usado quando user_content
for verdadeiro, que assume a forma de username/project
username
: o usuário a ser autenticado no GitHub para estender o limite da APIpassword
: a senha para autenticação no GitHub para estender o limite da APIrender_offline
: se deve renderizar localmente usando Python-Markdown (Nota: este é um trabalho em andamento)render_wide
: Se deve renderizar uma página larga, False
por padrão (isso não tem efeito quando usado com user_content
)render_inline
: Se os estilos devem ser incorporados no arquivo HTML (Nota: ao contrário de outras funções da API, o padrão é True
)out_filename
: O nome do arquivo no qual gravar, .html
por padrãoapi_url
: um URL base diferente para a API do github, por exemplo, o de uma instância do Github Enterprise. O padrão é a API pública https://api.github.com.title
: o título da página, derivado do path
por padrãoquiet
: não imprime no terminaltheme
: Tema para visualizar o arquivo markdown (modo claro ou modo escuro). Opções válidas ("claro", "escuro"). Padrão: "leve".grip_class
: Use uma classe Grip personalizada Cria um aplicativo Flask que você pode usar para renderizar e servir os arquivos Leiame. Este é o mesmo aplicativo usado para serve
e export
e inicializa o cache, usando os estilos armazenados em cache, quando disponíveis.
create_app ( path = None , user_content = False , context = None , username = None , password = None , render_offline = False , render_wide = False , render_inline = False , api_url = None , title = None , text = None , grip_class = None )
path
: O nome do arquivo a ser renderizado ou o diretório que contém seu arquivo Leiame, padronizando o diretório de trabalho atualuser_content
: se deve renderizar um documento como conteúdo do usuário, como comentários ou problemas do usuáriocontext
: o contexto do projeto a ser usado quando user_content
for verdadeiro, que assume a forma de username/project
username
: o usuário a ser autenticado no GitHub para estender o limite da APIpassword
: a senha para autenticação no GitHub para estender o limite da APIrender_offline
: se deve renderizar localmente usando Python-Markdown (Nota: este é um trabalho em andamento)render_wide
: Se deve renderizar uma página larga, False
por padrão (isso não tem efeito quando usado com user_content
)render_inline
: Se os estilos devem ser incorporados no arquivo HTMLapi_url
: um URL base diferente para a API do github, por exemplo, o de uma instância do Github Enterprise. O padrão é a API pública https://api.github.com.title
: o título da página, derivado do path
por padrãotext
: uma string ou fluxo de texto Markdown para renderizar em vez de ser carregado do path
(Nota: path
pode ser usado para definir o título da página)grip_class
: Use uma classe Grip personalizada Renderiza a aplicação criada por create_app
e retorna o HTML que normalmente apareceria ao visitar aquela rota.
render_app ( app , route = '/' )
app
: O aplicativo Flask para renderizarroute
: A rota a ser renderizada, '/' por padrão Renderiza o texto de marcação especificado sem armazenamento em cache.
render_content ( text , user_content = False , context = None , username = None , password = None , render_offline = False , api_url = None , title = None )
text
: O texto Markdown a ser renderizadouser_content
: se deve renderizar um documento como conteúdo do usuário, como comentários ou problemas do usuáriocontext
: o contexto do projeto a ser usado quando user_content
for verdadeiro, que assume a forma de username/project
username
: o usuário a ser autenticado no GitHub para estender o limite da APIpassword
: a senha para autenticação no GitHub para estender o limite da APIrender_offline
: se deve renderizar localmente usando Python-Markdown (Nota: este é um trabalho em andamento)api_url
: um URL base diferente para a API do github, por exemplo, o de uma instância do Github Enterprise. Isso é necessário quando não estiver usando o renderizador offline.title
: o título da página, derivado do path
por padrão Renderiza a marcação do caminho ou texto especificado, sem armazenamento em cache, e retorna uma página HTML semelhante à visualização Leiame do GitHub.
render_page ( path = None , user_content = False , context = None , username = None , password = None , render_offline = False , render_wide = False , render_inline = False , api_url = None , title = None , text = None , quiet = None , theme = 'light' , grip_class = None )
path
: O caminho a ser usado para o título da página, renderizando 'README.md'
se Nenhumuser_content
: se deve renderizar um documento como conteúdo do usuário, como comentários ou problemas do usuáriocontext
: o contexto do projeto a ser usado quando user_content
for verdadeiro, que assume a forma de username/project
username
: o usuário a ser autenticado no GitHub para estender o limite da APIpassword
: a senha para autenticação no GitHub para estender o limite da APIrender_offline
: se deve renderizar offline usando Python-Markdown (Nota: este é um trabalho em andamento)render_wide
: Se deve renderizar uma página larga, False
por padrão (isso não tem efeito quando usado com user_content
)render_inline
: Se os estilos devem ser incorporados no arquivo HTMLapi_url
: um URL base diferente para a API do github, por exemplo, o de uma instância do Github Enterprise. O padrão é a API pública https://api.github.com.title
: o título da página, derivado do path
por padrãotext
: uma string ou fluxo de texto Markdown para renderizar em vez de ser carregado do path
(Nota: path
pode ser usado para definir o título da página)quiet
: não imprime no terminaltheme
: Tema para visualizar o arquivo markdown (modo claro ou modo escuro). Opções válidas ("claro", "escuro"). Padrão: "leve".grip_class
: Use uma classe Grip personalizada Limpa os estilos e ativos armazenados em cache.
clear_cache ( grip_class = None )
Executa o Grip com os argumentos especificados.
main ( argv = None , force_utf8 = True )
argv
: os argumentos para executar, sys.argv[1:]
por padrãoforce_utf8
: define a codificação padrão como utf-8
na instância atual do Python. Isso não tem efeito no Python 3, pois o Unicode é tratado por padrãoUm aplicativo Flask que pode servir um arquivo ou diretório contendo um README.
Grip ( source = None , auth = None , renderer = None , assets = None , render_wide = None , render_inline = None , title = None , autorefresh = None , quiet = None , theme = 'light' , grip_url = None , static_url_path = None , instance_path = None , ** kwargs )
Retorna o renderizador padrão usando a configuração atual. Isso só será usado se o renderizador estiver definido como None no construtor.
Grip . default_renderer ()
Retorna o gerenciador de ativos padrão usando a configuração atual. Isso só será usado se asset_manager estiver definido como None no construtor.
Grip . default_asset_manager ()
Adiciona os tipos de conteúdo application/x-font-woff e application/octet-stream se eles estiverem ausentes. Substitua para adicionar tipos de conteúdo adicionais na inicialização.
Grip . add_content_types ()
Limpa os ativos baixados.
Grip . clear_cache ()
Renderiza a aplicação e retorna o unicode HTML que normalmente apareceria ao visitar no navegador.
Grip . render ( route = None )
route
: A rota a ser renderizada, /
por padrão Inicia um servidor para renderizar o README. Isso chama Flask.run internamente.
Grip . run ( host = None , port = None , debug = None , use_reloader = None , open_browser = False )
host
: O nome do host para escutar. Defina como '0.0.0.0'
para que o servidor também esteja disponível externamente, 'localhost'
por padrãoport
: A porta do servidor web. O padrão é 6419
debug
: se fornecido, habilite ou desabilite o modo de depuração. Consulte Flask.debug.use_reloader
: O servidor deve reiniciar automaticamente o processo python se os módulos forem alterados? False
por padrão, a menos que a configuração DEBUG_GRIP
seja especificada.open_browser
: Abre o navegador no endereço quando o servidor inicia Gerado quando Grip.run
é chamado enquanto o servidor já está em execução.
AlreadyRunningError ()
Gerado quando o Leiame especificado não foi encontrado.
ReadmeNotFoundError ( path = None , message = None )
Gerencia os recursos de estilo e fonte renderizados com páginas Leiame. Esta é uma classe base abstrata.
ReadmeAssetManager ( cache_path , style_urls = None )
Gerencia os recursos de estilo e fonte renderizados com páginas Leiame. Defina cache_path como None para desabilitar o cache.
Lê o conteúdo Leiame de um subcaminho de URL. Esta é uma classe base abstrata.
ReadmeReader ()
Lê arquivos Leiame de subcaminhos de URL.
DirectoryReader ( path = None , silent = False )
Lê o conteúdo Leiame da string unicode fornecida.
TextReader ( text , display_filename = None )
Lê o texto Leiame do STDIN.
StdinReader ( display_filename = None )
Renderiza o Leiame. Esta é uma classe base abstrata.
ReadmeRenderer ( user_content = None , context = None )
Renderiza o Leiame especificado usando a API GitHub Markdown.
GitHubRenderer ( user_content = None , context = None , api_url = None , raw = None )
Renderiza o Leiame especificado localmente usando Python puro. Nota: Este é atualmente um recurso incompleto.
OfflineRenderer ( user_content = None , context = None )
Os títulos de arquivos Markdown comuns no GitHub.
SUPPORTED_TITLES = [ 'README' , 'Home' ]
filename
: O arquivo UTF-8 a ser lido. As extensões suportadas, conforme definido pelo GitHub.
SUPPORTED_EXTENSIONS = [ '.md' , '.markdown' ]
Esta constante contém os nomes que o Grip procura quando nenhum arquivo é fornecido.
DEFAULT_FILENAMES = [ title + ext
for title in SUPPORTED_TITLES
for ext in SUPPORTED_EXTENSIONS ]
Esta constante contém o nome do arquivo Leiame padrão, a saber:
DEFAULT_FILENAME = DEFAULT_FILENAMES [ 0 ] # README.md
Esta constante aponta para o valor padrão se a variável de ambiente GRIPHOME
não for especificada.
DEFAULT_GRIPHOME = '~/.grip'
A URL padrão do servidor Grip e todos os seus ativos:
DEFAULT_GRIPURL = '/__/grip'
O valor app_url padrão:
DEFAULT_API_URL = 'https://api.github.com'
Instale o pacote e teste os requisitos:
$ pip install -e .[tests]
Execute testes com pytest:
$ pytest
Ou para executar novamente os testes conforme você faz alterações, use pytest-watch:
$ ptw
Se você estiver enfrentando problemas com o Grip, é provável que uma suposição feita sobre a API do GitHub tenha sido quebrada. Para verificar isso, execute:
$ pytest -m assumption
Como as suposições externas dependem de uma conexão com a Internet, você pode ignorá-las ao desenvolver localmente. Aperte ainda mais o ciclo parando na primeira falha com -x
:
$ pytest -xm " not assumption "
Ou com pytest-watch:
$ ptw -- -xm " not assumption "
Se o seu PR está esperando há algum tempo, sinta-se à vontade para me enviar um ping no Twitter.
Usa este software com frequência? ?