trello APIでカードの名前を取得してみる

## はじめに

kanban 系のタスク管理ツールを探していて会社の人に教えてもらいました。
これは結構良さそうだったので、いつもどおりタスク管理ツールからタスクを抜き出すスクリプトを書いてみました。

## 環境

* ruby 2.2.3p173
* MAC OS X (El Capitain)
※ windowsでも多分動くと思うのですが

API tokenは事前に取得している前提です

## コード

先に書いたコードを記載します。

```rb

require 'open-uri'
require 'json'

module MyTrello
  class Task
    def initialize(name, key, token)
      @name   = name
      @key    = key
      @token  = token
    end

    def boards
      responce = open(boards_url)
      code, message = responce.status
      if code == '200'
        @json = JSON.parse(responce.read)
      end
      # @json
    end

    def lists(boardname)
      @boardname = boardname
      boards
      board_id
      responce = open(lists_url)
      code, message = responce.status
      if code == '200'
        @listjson = JSON.parse(responce.read)
      end
    end

    def cards(boardname, listname)
      @boardname = boardname
      @listname  = listname
      lists(boardname)
      list_id
      responce = open(cards_url)
      code, message = responce.status
      if code == '200'
        @cardjson = JSON.parse(responce.read)
      end
      @cardjson
    end

    def cardnames(boardname, listname)
      cards(boardname, listname).collect do |card|
        card['name']
      end
    end

    private
    def board_id
      @json.each do |board|
        if board['name'] == @boardname
          @board_id = board['id']
        end
      end
    end

    def list_id
      @listjson.each do |list|
        if list['name'] == @listname
          @list_id = list['id']
        end
      end
      @list_id
    end

    def boards_url
      "https://trello.com/1/members/#{@name}/boards?key=#{@key}&token=#{@token}"
    end

    def lists_url
      "https://trello.com/1/boards/#{@board_id}/lists?key=#{@key}&token=#{@token}"
    end

    def cards_url
      "https://trello.com/1/lists/#{@list_id}/cards?key=#{@key}&token=#{@token}"
    end
  end
end
```

こんな感じです。
単純ですね。

## 使い方

pryでrequireして例で出します。
そして今回取り出すデータ元はこんな感じです。

<img width="853" alt="スクリーンショット 2015-10-29 0.01.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/20865/39a97b42-950a-9ef5-d37f-501d9c336f3c.png">

```
$ pry -r ./mytrello.rb
```

mytrello.rbは上記コードが書いてあるファイルです
とりあえずイニシャライズします。

 
```rb

[4] pry(main)> name  = "username"
=> "username"
[5] pry(main)> key   = "000000000000000000000000000000"
=> "000000000000000000000000000000"
[6] pry(main)> token = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a"
=> "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a"
[7] pry(main)> trello = MyTrello::Task.new(name, key, token)
=> #<MyTrello::Task:0x007fe47486a488
 @key="000000000000000000000000000000",
 @name="username",
 @token=
  "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a">
```

key, name, tokenの値は各自のものを入れます。
つづいて実際に実行してみます。用意しているコマンドは以下です。
すべて、インスタンスメソッドです。

* boards
    * ボード一覧のjsonデータを出します
* lists(boardname)
    * リスト一覧のjsonデータを出します
* cards(boardname, listname)
    * カード一覧のjsonデータを出します
* cardnames(boardname, listname)
    * カード一覧の名前を配列で返します。

実際のイメージです。

### boards

```rb
pry(main)> trello.boards
=> [{"name"=>"Doing",
  "desc"=>"",
  "descData"=>nil,
  "closed"=>true,
  "idOrganization"=>"56306c68cd4e76bda747e2c7",
  "pinned"=>nil,
  "invitations"=>nil,
  "shortLink"=>"aibKU27g",
  "powerUps"=>[],
  "dateLastActivity"=>nil,
  "idTags"=>[],
  "id"=>"56306dafd00fd151baf7edbf",
  "invited"=>false,
  "starred"=>false,
  "url"=>"https://trello.com/b/aibKU27g/doing",
  "prefs"=>
   {"permissionLevel"=>"private",
    "voting"=>"disabled",
    "comments"=>"members",
  略
```

### boards collectしてみる

trelloがjsonで介してくれるので、これをいじっていけばいい感じにいけますよね。

```rb
[13] pry(main)> trello.boards.collect{|board| board['name']}
=> ["Doing",
 "In Progress",
 "Tasks",
 "Welcome Board",
 "あまりにも秘密のプロジェクト"]
```

### lists

```rb
 [15] pry(main)> trello.lists("あまりにも秘密のプロジェクト")
=> [{"id"=>"56306e48cd95adfabb7d3fa1",
  "name"=>"In Progress",
  "closed"=>false,
  "idBoard"=>"56306e3d0220e708273b8c6b",
  "pos"=>65535,
  "subscribed"=>false},
 {"id"=>"56306e4f54ac86c9201683f1",
  "name"=>"Doing",
  "closed"=>false,
  "idBoard"=>"56306e3d0220e708273b8c6b",
  "pos"=>131071,
  "subscribed"=>false},
 {"id"=>"56306e5230ac095b026eaa84",
  "name"=>"Done",
  "closed"=>false,
  "idBoard"=>"56306e3d0220e708273b8c6b",
  "pos"=>196607,
  "subscribed"=>false}]
```

### listsをcollectしてみる
```rb
[16] pry(main)> trello.lists("あまりにも秘密のプロジェクト").collect{|list| list['name']}
=> ["In Progress", "Doing", "Done"]
```

### cards

```rb
[17] pry(main)> trello.cards("あまりにも秘密のプロジェクト", "In Progress)=> [{"id"=>"56306ff0800225dd8f7bb59a",
  "checkItemStates"=>[],
  "closed"=>false,
  "dateLastActivity"=>"2015-10-28T06:49:24.639Z",
  "desc"=>"",
  "descData"=>nil,
  "idBoard"=>"56306e3d0220e708273b8c6b",
  "idList"=>"56306e48cd95adfabb7d3fa1",
  "idMembersVoted"=>[],
  "idShort"=>5,
  "idAttachmentCover"=>nil,
  "manualCoverAttachment"=>false,
  "idLabels"=>[],
  "name"=>"どうしようもなく秘密のラベリングを考える",
  "pos"=>131071,
  "shortLink"=>"9Ml4KdoQ",
  "badges"=>
   {"votes"=>0,
    "viewingMemberVoted"=>false,
    "subscribed"=>true,
    "fogbugz"=>"",
    "checkItems"=>0,
    "checkItemsChecked"=>0,
    "comments"=>0,
    "attachments"=>0,
    "description"=>false,
    "due"=>nil},
  "due"=>nil,
```

nameばっかりで芸が無いので。
 
```rb
[18] pry(main)> trello.cardnames("あまりにも秘密のプロジェクト", "In Progress")=> ["どうしようもなく秘密のラベリングを考える",
 "trelloでタスク管理すればみんな幸せなのに！",
 "これで会話してるみたいに見える?"]
```

という風にできる感じをチョロっと書いてみました。

## 終わりに

WunderlistのAPIもそうですが、簡単にjson形式でデータが抜き出せるのでこれを別なところに連携するということあ比較的用意です。私の場合は日報を書くのが手間なので、普段の仕事をタスク管理ツールで行って、そこで完了した作業を少し加工して使用します。今回のコードで言うと
 
```rb
trello.cardsname(boardname, listname).collect{|cardname| "■ #{cardname}"}.sort
```

とかして、タスク自体にグルーピングした名前とかつけて投げるだけみたいなことをしてます。