TOMLの紹介

  • 前回のkawasaki.rbでTOMLを利用したツールの話をした
  • TOMLフォーマット自体がまだあんまり知られていなかったので紹介したい

TOMLとは

Tom’s Obvious, Minimal Language

By Tom Preston-Werner.

設定ファイルを記述するための言語

# 例
title = "TOML example"

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]

特徴

  • iniっぽい記法
  • 連想配列、配列、あといくつかのプリミティブ型
    • 文字列、整数、小数、ブール型、日付!
  • ようするにJSON

文法

基本的に key = value 形式で記述

id = 10
name = "snowcrush"
birthday = 1980-01-01T00:00:00Z # RFC3339
speed = 1.5e-3 # or 0.0015

#=> {"id":10,
#    "name":"snowcrush",
#    "birthday": "1980-01-01T00:00:00Z",
#    "speed": 0.0015}

テーブル(連想配列)はテーブル名を宣言

[table]
element = 1
# => {"table": {"element": 1}}

ネストしたテーブルはドットで名前をつなぐ

[app]
name = "app1"
[app.rootuser]
name = "snowcrush"
[app.database]
host = "192.168.0.100"
port = 5432

# => {"app":
#      {"name": "app1",
#       "rootuser": {"name": "snowcrush"},
#       "database": {"host": "192.168.0.100", "port": 5432}}}

テーブルの配列という記法もある

[[array_of_table]]
id = 10
[[array_of_table]]
id = 20

# => {"array_of_table": [{"id":10},{"id":20}]}

ね、簡単でしょ?

| 実際、YAMLの仕様が複雑すぎるのが開発の動機の一つらしい

和訳

  • 練習感覚でさくっと書いた
  • gistを本家に共有したら、マージしてくれた
  • 和訳のマージ後、韓国語と中国語の翻訳も出てきたので、先鞭付けられたのかなと

利用例

利用例

  • dep
  • Cargo
  • GitLab
  • InfluxDB
  • hugo

dep

  • Go言語のパッケージ依存管理ツール
  • 依存関係の記述とロックに使われる
    • Bundler における Gemfile, Gemfile lock
  • 将来公式に取り込まれる見込み

Cargo

  • Rust言語のパッケージマネージャ
  • ビルドツールでもある
  • Bundlerみたいなもの

GitLab

  • 同梱のCIツールで利用

InfluxDB

  • 時系列データベス
  • ログ集計などで使われる

hugo

  • Go言語製の静的サイトジェネレータ
  • 軽い
  • ブログとかが割とさくっと書ける
  • このスライドもHugoで作成されている

Parser

  • 多くの言語に既に存在する
  • まだ無い言語を見つけたらコントリビュートのチャンスかも

Ruby

  • tomlrb
  • toml-rb
  • toml => あんまりメンテされていない?

現況

  • 最新は0.4
  • ほとんど仕様は固まりつつある
    • 現行を導入しても将来互換性で問題になることは殆どないと思う
  • おそらく次期バージョンが1.0になる
  • メンテナ(@mojombo)が忙しいため仕様策定は停滞気味

今後も、わりと広く使われると思います