Packages

Extractly `mix xtra` task to render `EEx` templates with easy access to hexdocs. The Extractly module gives easy access to Elixir metainformation of the application using the extractly package, notably, module and function documentation.

Current section

Files

Jump to
extractly README.md
Raw

README.md

# Extractly
<!--
DO NOT EDIT THIS FILE
It has been generated from the template `README.md.eex` by Extractly (https://github.com/RobertDober/extractly.git)
and any changes you make in this file will most likely be lost
-->
[![CI](https://github.com/RobertDober/extractly/actions/workflows/ci.yml/badge.svg)](https://github.com/RobertDober/extractly/actions/workflows/ci.yml)
[![Coverage Status](https://coveralls.io/repos/github/RobertDober/extractly/badge.svg?branch=main)](https://coveralls.io/github/RobertDober/extractly?branch=main)
[![Hex.pm](https://img.shields.io/hexpm/v/extractly.svg)](https://hex.pm/packages/extractly)
[![Hex.pm](https://img.shields.io/hexpm/dw/extractly.svg)](https://hex.pm/packages/extractly)
[![Hex.pm](https://img.shields.io/hexpm/dt/extractly.svg)](https://hex.pm/packages/extractly)
## Mix task to Transform EEx templates in the context of the `Extractly` module.
This tool serves two purposes.
1. A simple CLI to basicly `EEx.eval_file/2`
1. Access to the `Extractly` module (available as binding `xtra` too)
1. Access to the name of the rendered template with the `template` binding
The `Extractly` module gives easy access to Elixir metainformation of the application using
the `extractly` package, notably, _module_ and _function_ documentation.
This is BTW the raison d'être of this package, simple creation of a `README.md` file with very simple
access to the projects hex documentation.
Thusly hexdoc and Github will always be synchronized.
To see that in action just look at the [`README.md.eex`](README.md.eex) file of this package and compare
with what you are reading here.
Example Template:
Some text
<%= xtra.functiondoc("M.shiny_function/2") %>
<%= xtra.moduledoc("String") %>
More text
### Usage:
mix xtra [options]... [template]
#### Options:
--help | -h Prints short help information to stdout and exits.
--quiet | -q No output to stdout or stderr
--version | -v Prints the current version to stdout and exits.
--verbose Prints additional output to stderr
--output filename
The name of the file the rendered template is written to, defaults to the templates'
name, without the suffix `.eex`
#### Argument:
template, filename of the `EEx` template to use, defaults to `"README.md.eex"`
### API
### Extractly.functiondoc/2
Returns docstring of a function (or nil)
Ex:
```elixir
iex(0)> Extractly.functiondoc("Extractly.moduledoc/2")
...(0)> |> String.split("\n") |> Enum.take(3)
[" Returns docstring of a module (or nil)", " Ex:", ""]
```
We can also pass a list of functions to get their docs concatenated
```elixir
iex(1)> out = Extractly.functiondoc(["Extractly.moduledoc/2", "Extactly.functiondoc/2"])
...(1)> String.split(out, "\n") |> Enum.take(5)
[ " Returns docstring of a module (or nil)",
" Ex:",
"",
" Extractly.moduledoc(\"Extractly\")",
""]
```
If all the functions are in the same module the following form can be used
```elixir
iex(2)> out = Extractly.functiondoc(["moduledoc/2", "functiondoc/2"], module: "Extractly")
...(2)> String.split(out, "\n") |> hd()
" Returns docstring of a module (or nil)"
```
However it is convenient to add a markdown headline before each functiondoc, especially in these cases,
it can be done by indicating the `headline: level` option
```elixir
iex(3)> Extractly.functiondoc(["moduledoc/2", "functiondoc/2"], module: "Extractly", headline: 2)
...(3)> |> String.split("\n") |> Enum.take(3)
[ "## Extractly.moduledoc/2",
"",
" Returns docstring of a module (or nil)"]
```
Often times we are interested by **all** public functiondocs...
```elixir
iex(4)> out = Extractly.functiondoc(:all, module: "Extractly", headline: 2)
...(4)> String.split(out, "\n") |> Enum.take(3)
[ "## Extractly.do_not_edit_warning/1",
"",
" Emits a comment including a message not to edit the created file, as it will be recreated from this template."]
```
We can specify a language to wrap indented code blocks into ` ```elixir\n...\n``` `
Here is an example
```elixir
iex(0)> Extractly.functiondoc("Extractly.functiondoc/2", wrap_code_blocks: "elixir")
...(0)> |> String.split("\n") |> Enum.take(10)
[ " Returns docstring of a function (or nil)",
" Ex:",
"",
"```elixir",
" iex(0)> Extractly.functiondoc(\"Extractly.moduledoc/2\") ",
" ...(0)> |> String.split(\"\\n\") |> Enum.take(3)",
" [\" Returns docstring of a module (or nil)\", \" Ex:\", \"\"]",
"```",
"",
" We can also pass a list of functions to get their docs concatenated"]
```
### Extractly.task/2
Returns the output of a mix task
Ex:
```elixir
iex(5)> Extractly.task("cmd", ~W[echo 42])
"42\n"
```
```elixir
iex(0)> Extractly.task("xxx") |> String.split("\n")|> hd()
"***Error, the following output was produced wih error code 1"
```
## Installation
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `extractly` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:extractly, "~> 0.4.0"}
]
end
```
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/extractly](https://hexdocs.pm/extractly).
## Author
Copyright © 20[18-21] Robert Dober, robert.dober@gmail.com,
# LICENSE
Same as Elixir, which is Apache License v2.0. Please refer to [LICENSE](LICENSE) for details.
SPDX-License-Identifier: Apache-2.0