オブジェクトをテキストのテーブル表記にする table_format gem の紹介

こんな感じでオブジェクトをテーブル表記で表示する [table_format](https://github.com/akicho8/table_format) の紹介です。

```:irb
>> tp GC.stat
|-----------------------------------------+----------|
|                                   count | 25       |
|                    heap_allocated_pages | 112      |
|                      heap_sorted_length | 112      |
|                  heap_allocatable_pages | 0        |
|                    heap_available_slots | 45654    |
|                         heap_live_slots | 45574    |
|                         heap_free_slots | 80       |
|                        heap_final_slots | 0        |
|                       heap_marked_slots | 35528    |
|                         heap_eden_pages | 112      |
|                         heap_tomb_pages | 0        |
|                   total_allocated_pages | 112      |
|                       total_freed_pages | 0        |
|                 total_allocated_objects | 222393   |
|                     total_freed_objects | 176819   |
|                   malloc_increase_bytes | 231664   |
|             malloc_increase_bytes_limit | 16777216 |
|                          minor_gc_count | 21       |
|                          major_gc_count | 4        |
|       remembered_wb_unprotected_objects | 295      |
| remembered_wb_unprotected_objects_limit | 422      |
|                             old_objects | 34856    |
|                       old_objects_limit | 52480    |
|                oldmalloc_increase_bytes | 2305744  |
|          oldmalloc_increase_bytes_limit | 16777216 |
|-----------------------------------------+----------|
```

# 特徴

1. tp メソッドの引数にオブジェクトを指定するとテーブル表記で表示します。
1. 主にデバッグ用で pp よりも簡潔に表示したい場合の利用を想定しています。
1. rake タスクの結果を整えて表示したいときなどにも有用かもしれません。
1. デフォルトでは Org 用のテーブル表記ですが Markdown のテーブル表記にも対応しています。
1. 日本語でもガタガタになりません

# インストール方法

```bash
gem i table_format
```

そのあとは `require 'table_format'` です。

# 使用例

## ハッシュの配列

いちばんよく使う例です。

```ruby:コード
tp [{id: 1, name: 'alice'}, {id: 2, name: 'bob'}]
```

```text:表示
|----+-------|
| id | name  |
|----+-------|
|  1 | alice |
|  2 | bob   |
|----+-------|
```

数字は右寄せ、文字列は左寄せにします。

org-table 用のフォーマットなので Org 文書にコピペできます。

## ハッシュ

```ruby:コード
tp({id: 1, name: 'alice'})
```

```text:表示
|------+-------|
|   id | 1     |
| name | alice |
|------+-------|
```

見やすくするため、ハッシュの場合に限り、キーと値を中央ライン寄りにしています。

## 配列

```ruby:コード
tp [:alice, :bob]
```

```text:表示
|-------|
| alice |
| bob   |
|-------|
```

配列の場合、縦に並びます。

## 数値・文字列・シンボル

```ruby:コード
tp 1
tp 'foo'
tp :foo
```

```text:表示
|---|
| 1 |
|---|
|-----|
| foo |
|-----|
|-----|
| foo |
|-----|
```

配列や、これらはとくに嬉しくありませんが、コンソールで目立たせて表示したい場合などにたまに使うことがあります。

## ActiveRecord と Mongoid を少し便利にします

AR または Mongoid で、次のようにして作ったレコードがあったとします。

```ruby
['alice', 'bob'].each { |e| User.create!(name: e) }
```

そこで `tp モデルクラス` とすると全件数をテーブル表示します。

```ruby:コード
tp User
```

```text:表示
|----+-------|
| id | name  |
|----+-------|
|  1 | alice |
|  2 | bob   |
|----+-------|
```

リレーションのインスタンスもそのままテーブル表示できます。

```ruby:コード
tp User.limit(1)
```

```text:表示
|----+-------|
| id | name  |
|----+-------|
|  1 | alice |
|----+-------|
```

モデルクラスのインスタンスの場合は属性を表示します。

```ruby:コード
tp User.first
```

```text:表示
|------+-------|
|   id | 1     |
| name | alice |
|------+-------|
```

### ActiveRecord の select_all の結果に対して

これもそのままテーブル表示できます。

```ruby:コード
tp ActiveRecord::Base.connection.select_all('SELECT * FROM users')
```

```text:表示
|----+-------|
| id | name  |
|----+-------|
|  1 | alice |
|  2 | bob   |
|----+-------|
```

# テーブル表示ではなく文字列で欲しい場合

`to_t` メソッドを使います。

```ruby:コード
[{id: 1, name: 'alice'}, {id: 2, name: 'bob'}].to_t
```

```text:結果の文字列
|----+-------|
| id | name  |
|----+-------|
|  1 | alice |
|  2 | bob   |
|----+-------|
```

# Markdown フォーマットにしたい場合

```ruby:オプション一覧
tp TableFormat.default_options
```

```text:表示
|-------------------+-------|
|          markdown | false |
|            header |       |
|             cover | true  |
|          vertical | |     |
|      intersection | +     |
| intersection_both | |     |
|           horizon | -     |
|           padding |       |
|           in_code | UTF-8 |
|-------------------+-------|
```

このなかの markdown を true にすると Markdown フォーマットになります。
次のように tp メソッドの最後にオプションを指定します。

```ruby:コード
tp [{id: 1, name: 'alice'}, {id: 2, name: 'bob'}], markdown: true
```

```text:表示&nbsp;(Markdownフォーマット)
| id | name  |
|----|-------|
|  1 | alice |
|  2 | bob   |
```

出力を qiita にそのままコピペできます。

以上です。よかったら使ってみてください。