Opis
A tool for debugging through recording the parameters and return values in the call tree of a function.
⚠️ Opis isn't working quite right for OTP-27 due to the tracing changes. A fix is in development.⚠️
Usage
Opis allows you to analyze all calls that an expression makes:
Opis.analyze(MyApp.do_thing())
To retrieve this data, use calls/0:
Opis.calls()This will return a call tree, something like this:
[
%Opis.Call{call: {MyApp, :do_thing, []}, return: {:ok, :success}, children: [
%Opis.Call{call: {MyApp.Thing.do_thing, []}, return: {:ok, :success}, children: [
# etc
]}
]}
]to_string is implemented for the Opis.Call struct, so you can use IO.puts to view the calls in a more friendly format, e.g.
MyApp.do_thing() => {:ok, :success}
MyApp.Thing.do_thing() => {:ok, :success}
# etc
These two steps can be performed in one fell swoop with Opis.analyze_and_print:
Opis.analyze_and_print(MyApp.do_thing())
# MyApp.do_thing() => {:ok, :success}
# MyApp.Thing.do_thing() => {:ok, :success}
# etc
{:ok, :success}Installation
The package can be installed by adding opis to your list of dependencies in mix.exs:
def deps do
[
{:opis, "~> 0.2.0", only: [:dev, :test]}
]
endThe docs can be found at https://hexdocs.pm/opis.
Name
One of my other libraries is named Saturn, and Saturn's consort is named Ops. Well, I couldn't name this "Ops" now could I? Apparently there's another spelling, "Opis," which purportedly also means "plenty" in Latin.