ページ

2015年11月14日土曜日

Elixir/Phoenixで遊ぶ 13 - ElixirでGitHubリポジトリ同期ツールの作成 その2-


前回に続いて同期ツールの作成

   config/config.exsの使用


前回GitHubApiを使ってリポジトリの一覧を取得した際にユーザー名や
リクエストURLをソースコード上に直で書いていましたが、今回はconfig/config.exs
を読み込んで使ってみたいと思います。
まずはconfig/config.exsに以下内容を追加
config :synchub,
  apiurl: "https://api.github.com/",
  userid: "{ユーザーID}",
  username: "{ユーザー名}"
※{ユーザーID}/{ユーザー名}は使用するアカウントのユーザー名、ユーザーIDを設定して下さい
lib/synchub.exを修正
defmodule Synchub do
  @moduledoc """
  The module of sync github repos.
  """
  use HTTPotion.Base

  @apiurl Application.get_env(:synchub, :apiurl) # (1)ここ!

  @doc "handle create url."
  def process_url(url) do
    @apiurl <> url
  end

  @doc "handle create request header."
  def process_request_headers(headers) do
    Dict.put headers, :"User-Agent", Application.get_env(:synchub, :username) # (2)ここ!
  end

  @doc "handle response of html body."
  def process_response_body(body) do
    body |> Poison.decode! |> put_repo_name
  end

  @doc "put repos name."
  def put_repo_name([info|tail]) do
    IO.puts info["name"]
    put_repo_name(tail)
  end

  def put_repo_name([]), do: nil
end
config/config.exsで設定した値を読み込む時はApplication.get_envを使う
↑では(1)と(2)でそれぞれapiurlusernameを読み込んでいる

   カスタムタスクの作成


前回は以下のように実行していましたが、
$ iex -S mix
iex(1)> Synchub.get("users/{ユーザーID}/repos")
一回一回iexを起動するのも面倒くさいので、mixのタスクを作成してみたいと思います。 作成したいタスクとしては・・・
$ mix list.github.repos
とすると、config/config.exsで設定されたユーザーのリポジトリ一覧を取得できたら良さげ
  • タスクファイルの作成
lib/mix/tasks/list.github.repos.exを作成し、以下内容に編集する
defmodule Mix.Tasks.List.Github.Repos do
  use Mix.Task

  @shortdoc "Show github repos list" # (1)

  def run(args) do
    url = "users/" <> Application.get_env(:synchub, :userid) <> "/repos" # (2)
    Synchub.start
    Synchub.get(url)
  end
end
モジュール名は作成したファイル名と対応する様な名前で作成
(1) @shortdocを書く事でmix helpの一覧に説明が表示される
(2) ここでconfig/config.exsからuseridを読み込みurlを作成
  • コンパイル
$ mix compile
mix helpで一覧に表示されているか確認してみる
$ mix help
・・・
mix list.github.repos # Show github repos list
・・・
↑の様に表示されればOK
  • 実行
$ mix list.github.repos
前回と同じ様にリポジトリの一覧が表示されればOKです

0 件のコメント:

コメントを投稿