Notion AI にサポートされた NotionRubyMapping の更新 : Notion 解説(71)

1. はじめに

これは「Notion Community Advent Calendar 2022」の1日目の記事です。 adventar.org

ということで、今日から Notion Community のアドベントカレンダーが始まりました。執筆陣は以下のようになっております。すごい人が集まっていますよ。楽しみですね。

執筆陣

初日なのでアンバサダーの私から軽く始めてみたいと思います。

2. Notion AI と遊ぶ

今の時点で Notion AI で遊べているのは、申し訳ないですがアンバサダーだけとなっていると思います。いろんな人が Twitter や動画、YouTube ライブなどで披露しているので楽しみにしている人が多いと思います。待っただけの甲斐はあると思うので、順番が回ってきたらたくさん遊んでください。色々な人にデモした結果をこちらのページにまとめているので、興味があったらみてください。

hkob.notion.site

その中で、「Ruby で NotionRubyMapping を使って、page を作成するコードを書いてください。」と指示してみました。書かれたコードはこちらです。

require 'notion_ruby_mapping'

# Connect to Notion
NotionRubyMapping.configure do |config|
  config.token = 'your-token-here'
end

# Create a new page
page = NotionRubyMapping::Page.create(
  title: 'Hello, world!',
  body: 'This is a test page.'
)

# Save the page to Notion
page.save

これ、かなりいい線をついているし、見やすいコードです(このままでは動きませんが)。特に configure でトークンをセットするのは Ruby っぽい書き方で格好いいですね。悔しくなったので、この config の書き方をできるようにしてみました。

3. 現状把握

NotionRubyMapping は当初自分で API アクセスをせず、notion-ruby-client という別の gem を使って、API アクセスをしていました。このクライアントを作るという動作のため、トークンの設定は以下のような記述方法になっていました。

NotionCache.instance.create_client "secret_XXXXXXXXXXXXXXXXXXXX" # write directly

このメソッドは以前は、内部で notion-ruby-client のオブジェクトを作成し、それにキーを渡すような処理をしていました。しかし、notion-ruby-client のバージョンアップがなかなかされず、それが原因で NotionRubyMapping 自体もアップデートできないという問題が発生しました。そのため、現在では notion-ruby-client に依存せず、自分で API アクセスを実行するように変更させました。

このため、このメソッドは単にシングルトンの NotionCache オブジェクトに変数を設定するだけの関数に成り下がっています。notion_token は単に @notion_token というインスタンス変数に入れているだけですね。その他にも wait という API 呼び出しごとに待つ秒数もセットできるようにしています。Notion API は 3アクセス/秒の制限があるため、デフォルトで 1/3 秒のウエイトを入れています。3回以下のアクセスしかしないようなプログラムの場合には、wait = 0 も選べるようになっています。

    def create_client(notion_token, wait: 0.3333, debug: false)
      @notion_token = notion_token
      @wait = wait
      @debug = debug
      self
    end

4. NotionRubyMapping.configure の作成

やりたいことは上記変数群を configure で設定できるようにすることです。これらの変数を持っているのは NotionCache のシングルトンオブジェクトなので、それを yield で渡してあげればいいわけです。ということで、notion_ruby_mapping.rb に configure メソッドを追加しました。

module NotionRubyMapping
  def configure
    yield NotionRubyMapping::NotionCache.instance
  end
  module_function :configure
end

そして、NotionCache クラスに attr_accessor を追加しました。以上で改修は終わりです。

    attr_accessor :notion_token, :wait, :debug

5. 新しいインテグレーションの使い方

上記の修正で NotionRubyMapping.configure が使えるようになっています。そのため、こんな文章を README.md に追加しました。

v0.7.0 から NotionRubyMapping.configuration で設定できるようになりました。

NotionRubyMapping.configuration do |config|
    config.notion_token = "secret_XXXXXXXXXXXXXXXXXXXX" # write directly
    config.wait = 0
end
NotionRubyMapping.configuration { |c| c.notion_token = ENV["NOTION_API_TOKEN"] } # from environment

5. おわりに

Notion AI にいい書き方を教えてもらいました。ちょっと格好よくなりましたね。ということで、この記事とともに gem を 12/1 に v0.7.0 として公開します。すでに使っている人も新しい書き方を使うようにしてみてください(コードは消していないので、古い書き方もそのまま使えます)。

初日なのでこんな軽いネタにしてみました。執筆陣は色々な方向に長けた方々ばかりなので、同じ Notion ネタでもさまざまなネタが出てくると思います。私も楽しみです。

明日は Tsuburaya | Notion 公式アンバサダー (@___35d) / Twitter さんの「2022年 Notion 振り返り / 2022年の Notion アップデート内容を振り返り」です。お楽しみに。


hkob.notion.site