Wyszedł nowy elixir (1.5) a wraz z nim kilka fajnych opcji debugowania kodu. Jednak zanim do nich przejdę (czyli następnym razem) warto wspomnieć o jednej która już istnieje od dawien dawna – to znaczy, nie wiem jak dawno dawno ale na pewno z rok? Jak wiadomo elixir przychodzi z REPL iex. A ten REPL zaś przychodzi z rozszerzeniami do siebie. Tak zwanym modułem IEx.Helpers – gdzie Helpers jest importowane w niewidoczny dla nas sposób (poniżej link dlaczego i jak). Jedną z metod jaka będzie dostępna po załączeniu modułu to pry/0 – umożliwia nam ona ustawianie pułapek w kodzie. Jeżeli tylko nasz kod na nią natrafi w konsoli pojawi nam się informacja czy chcemy zatrzymać proces i debugować dostępne wartości.

Przygotujmy sobie środowisko, tym razem wystarczy nam czysty plik z modułem, może to być Bencode.ex jak i każdy inny. Do skorzystania z opcji dostępnych przez moduł IEx musimy go dodać do początku naszego pliku. Dodajemy my go za pomocą require i dodajemy go przed defmodule!!!

Początek pliku powinien mniej więcej tak wyglądać:

require IEx;

defmodule Bencode do
    # ....
end

Następnie w każdym miejscu, w którym byśmy chcieli z debugować nasz kod musimy dodać wywołanie funkcji IEx.pry/0. Dla przykładu możemy do dodać tutaj:

def decode (input) do
  val = input |> do_decode |> elem(0)

  IEx.pry

  case val do
    nil -> {:error, "wrong format: #{input}"}
    el -> {:ok, el}
  end
end

Mając tak kod przygotowany jesteśmy gotowi do testów. Wystarczy teraz odpalić iex z naszym plikiem:

iex bencode.ex

Jeżeli zaś jesteście na windows to może się okazać, że dostaniecie taki oto błąd:

iex(1)> Bencode.decode("i15e")
Cannot pry #PID<0.118.0> at lib/bencode.ex:57. Is an IEx shell running? If you are Windows, you may need to start IEx with the --werl flag.
Cannot pry #PID<0.118.0> at lib/bencode.ex:38. Is an IEx shell running? If you are Windows, you may need to start IEx with the --werl flag.
{:ok, 15}
iex(2)>

Jak widać miałem dwa IEx.pry/0 ustawione i dwa nie zadziałały. Jest to pewnie spowodowane problemem z otwieraniem i zamykaniem okien/terminali w Windows gdyż podczas pracy z IEx.pry/0 będziemy ubijać i na nowo tworzyć procesy iex. By naprawić ten problem wystarczy odpalić iex następująco:

iex --werl bencode.ex

To nam stworzy okno erlanga w którym nasz iex będzie hostowany:

Okno hostowania iex w emulatorze erlanga
Okno hostowania iex w emulatorze erlanga

Teraz możemy zacząć się bawić, wystarczy, że odpalimy polecenie:

iex(1)> Bencode.decode("i15e")

I dostajemy takie o to pytanie:

Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)
Request to pry #PID<0.105.0> at lib/bencode.ex:38
        val = input |> do_decode |> elem(0)

        IEx.pry

        case val do

Allow? [Yn] Y

W zależności od odpowiedzi, albo zostanie stworzony proces pry albo i nie, jeżeli zostanie to będziemy mieć nowy przedrostek w konsoli:

pry(1)>

Teraz możemy dowiedzieć się takich rzeczy jak, jaki jest numer PID aktualnego procesu, jakie wartości kryją się pod input czy value:

Debugowanie kodu z wykorzystaniem IEx.pry
Debugowanie kodu z wykorzystaniem IEx.pry

Powrót do iex następuje po wykonaniu funkcji respawn/0:

pry(4)> respawn

Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)
{:ok, 15}
iex(1)>

Podsumowanie

To tyle, prosty sposób a jednak o nim nie wiedziałem. Czy jest on przydatny? Nie wiem, trzeba modyfikować kod, wstawiać metodę by dostać odpowiednie zapytanie. A co jeżeli takie coś przypadkiem trafi na produkcje? Słabo? Trochę. Ja bym tego unikał. Jednak do zabawy lokalnie i obserwacji jak elixir działa lub jak nasza funkcja działa moim zdaniem bardzo fajne narzędzie nie wymagające mix.

Za tydzień zaś opiszę nowości z elixir 15 gdyż one trochę zmieniają to podejście dając więcej fajniejszych opcji, które rozwiązują problemy IEx.pry/0.

1 KOMENTARZ

Comments are closed.