はじめに
hkob の雑記録の第356回目は、プロパティ要素の Filter object について改訂していきます。本記事は2025年ユカスタマスの22日目(2023年ユカスタマスの753日目)の記事になります。
有効期限プロパティの Filter 作成
今回、改訂版の修正をするにあたりリファレンスを見ていたところ、有効期限にも専用の Filter 記述が用意されていることに気づきました。リファレンスに書かれているサンプルは以下のようになっています。status には "verified" , "expired" , "none" のいずかを選択できるようです。
{ "filter": { "property": "verification", "verification": { "status": "verified" } } }
NotionRubyMapping ではこの機能に対応していなかったので、アップデートをしようと思います。実装の前に verification_property_spec.rb にテストを追加します。Database と DataSource は特別な機能がないので、テストを記述していなかったため、以下のテストを追加しました。
context "when Database property" do context "when created by new" do let(:target) { described_class.new "vp", base_type: "database" } it_behaves_like "has name as", "vp" %w[verified expired none].each do |status| it_behaves_like "filter test", described_class, %w[status], value: status end it_behaves_like "raw json", :verification, {} it_behaves_like "property schema json", {"vp" => {"verification" => {}}} end end context "when DataSource property" do context "when created by new" do let(:target) { described_class.new "vp", base_type: "data_source" } it_behaves_like "has name as", "vp" %w[verified expired none].each do |status| it_behaves_like "filter test", described_class, %w[status], value: status end it_behaves_like "raw json", :verification, {} it_behaves_like "property schema json", {"vp" => {"verification" => {}}} end end
この中の "filter test" の shared example では、filter_status という新規のメソッドをテストすることになります。他の filter では複数のプロパティに同じメソッドが配置されることがあるため、module として導入していました。今回の status については、verification property のみとなるので、直接メソッドを実装しました。といっても共通メソッドである make_filter_query を呼んでいるだけなので、実装はそれほど難しいわけではありませんでした。
# @param [String, Number] value Query value # @param [String] condition rollup Rollup name # @param [String] another_type rollup_type Rollup type # @return [NotionRubyMapping::Query] generated Query object # @see https://www.notion.so/hkob/CheckboxProperty-ac1edbdb8e264af5ad1432b522b429fd#5f07c4ebc4744986bfc99a43827349fc def filter_status(value, condition: nil, another_type: nil) make_filter_query "status", value, condition: condition, another_type: another_type end
これだけのためにバージョンを上げるのも面倒なので、オフィシャルのリリースは少し待つことにします。version のみをあげておき、ローカルパッケージのみを build し、インストールしました。この先はローカルパッケージで実行します。
> rake build notion_ruby_mapping 3.0.6 built to pkg/notion_ruby_mapping-3.0.6.gem. > gem install pkg/notion_ruby_mapping-3.0.6.gem Successfully installed notion_ruby_mapping-3.0.6 Parsing documentation for notion_ruby_mapping-3.0.6 Installing ri documentation for notion_ruby_mapping-3.0.6 Done installing documentation for notion_ruby_mapping after 0 seconds 1 gem installed
有効期限 (verification) に対する条件
これを踏まえて、最後の節として以下のものを追加しました。
初版の時には存在していなかった有効期限プロパティにも専用の検索条件が用意されています。
"status"というキー値に対して、"verified"(有効)、"expired"(期限切れ) 、"none"(設定なし) が選べます。全ての有効なページを抽出する場合は以下のようになります。print JSON.pretty_generate(vp.filter_status("verified").filter) { "property": "Verification", "verification": { "status": "verified" } }=> nil
おわりに
なんとか長かった Chapter-2 が全て修正できました。次からは実際の API 呼び出しの部分に入ります。ここはデータベースとデータソースの変更があるため、かなり修正が多くなります。