appiaries の ruby ライブラリつくるよ gem で公開できたらなー ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

**随時つくりながら更新してます**

gemつくってみるよ。mBaaSの appiaries の ruby クライアントをつくるよ。

github はこちら

https://github.com/scleen/appiaries

# 手順

## ひながたの作成

bundle コマンドを使ってgemのひな形をつくります :smile: 自動的にいろんなファイルができるよ :file_folder: 

```bash
bundle gem appiaries
```

今回は rest-client を使ってつくる予定なので、rest-clientを使った超軽量クライアントライブラリの一つである rekognize を参考にしてつくっていきます :eyes:  .rb ファイルが5つぐらいなのでシンプルです :balloon: 

と思ったけど、rekognize の実装がクソ :poop: なんじゃないかと・・・可読性低すぎる実装に見えて :cry: 、ruby の include ってこんな風につかうのか :sushi:

**追記：読んでみたらひどかったので、rekognize は参考にしないことに :imp: parse-ruby-client https://github.com/adelevie/parse-ruby-client の実装が綺麗に見える。rest-client じゃなくて Faraday :zap: 使ってるけど。**


## 設計というかこんな感じなつくりにする

:tractor: どんな設計にしましょう？appiaries はTOKEN :secret: を必ずリクエストに詰める必要があるので、それをinitializeでわたし感じとか、そういうことを考えていきます。

### 実装のポイント

 - token を初期化時に渡すようにする
 - パラメーターの ?get=true を自動的に付加するようにする
 - 戻りは強制的にJSON :question: いいのかな
 - endpointが複数あるのはどうしようかな・・・
 - とりあえず作成と参照からつくっていく感じ
 - JSONオブジェクトに対する操作の例：メソッド名称はパラメーターprocのものを採用
   - create 登録する
   - put 置き換え登録する
   - patch 更新する
   - delete 一括削除（検索条件指定した場合）
   - delete 一件削除またはオブジェクトのフィールド削除
   - get 検索
   - count 件数取得（検索条件指定）

:scream: delete が曖昧な感じ・・・他のライブラリのAPIを見て実装を合わせるか？Androidの実装はメソッド名にあたる部分がREST-APIと統一されてないのね :cry:

| METHOD | Android | REST API |
|:-----------|:-----------:|:------------:|
| 登録する       |    registJsonData     |     create     |
| 置き換え登録する     |      putJsonData |    put    |
| 更新する       |        updateJsonData |     patch     |
| 一括削除         |          deleteJsonData|      delete      |
| フィールド削除         |          deleteJsonData |      delete      |
| 一件削除       |       deleteJsonData|    delete    |
| 一件取得       |       getJsonData|    get    |
| 検索    |     selectJsonData|   get    |
| 件数取得    |     |   count    |

整理してたら頭痛がしてきた :cry:

# とりあえずつくってみよう

## 実装をどうしようかなぁ？

appiaries は主に Json と File という二つのオブジェクトを入れておける。とりあえず、それだけ考えてみる。User、Pushとかもあるけど :wink:

## JSONオブジェクトの場合

### JSON オブジェクトのappiariesとのやり取り :beer:

Jsonを扱うから、保存処理を

```rb
my_data = {"name" => "scleen"}
my_data.save
```

みたいに書けるようにしちゃうとか、やばい、恰好いい！でもやりすぎよね。 :smiling_imp:

```rb
require 'appiaries'
{"name" => "scleen"}.save
```

とか書いてJSON保存できるとか素敵 :dancer: だけど。 

```rb
{"name" => "scleen"}.update(object_id) # for update
hoge = {}
hoge.get(object_id) # for get
```

とか、どう :question: 

でも、これ、家の全ての窓 :house: に消せないクリスマス :christmas_tree: のデコレーション施すようなもんだ。クリスマスが過ぎたらいらないよね。Hash 自体がJSON保存以外の目的でもプログラム中で使われるから、この方法は却下。 :-1:

### 無難に parse-ruby-client みたいに書くのかな

Clientクラスを定義して、create, update でHash渡すような実装が無難かなぁ :sunglasses: 

```rb
client = Appiaries::Client.new(opts)
client.create({"name" => "scleen"}) # create
client.get(object_id) # get
```

例えば↑上のこんな感じ :alien: これだと通信を行うclientを意識させる実装だよね。

REST-APIの面倒なのは

 - 適切なURIをつくる :earth_asia: 
 - 所定の場所にパラメーターを収めること（queryパラメーターなのか、payloadなのか、headerなのか） :envelope: 

だろうから、この辺を隠せていればOKなんじゃないかな

```rb
obj = AppiariesObject.new
obj["name"] = "scleen"
obj.create
```

とか、もありだよね。これはまるっきり parse-ruby-client の実装と同じだね。
この実装だと、よりオブジェクトが意識されてるね。

### それともFileみたいに書く？

```rb
f = File.new(path_to_file)
f.write(something)
```

的な感じで

```rb
obj = AppiariesObject.new(object_name)
obj.create({"name" => "scleen"}) # create
```

とか？

# gem つくりかたの参考リンク

 - [Gem作成手順覚書](http://qiita.com/Kuchitama/items/18e680de0f562f8b8873)
 - [作ったgemをリリースするまで](http://qiita.com/kt_Biz/items/b292f727e213ed7db9d7)
 - [君がOpsでもRubyで書いたライブラリはGemで配ろう](http://qiita.com/sawanoboly/items/ede7715c605e5822ad22)