NotionRubyMapping の 2026-03-11 対応(1) : hkob の雑記録 (434)

はじめに

hkob の雑記録の第434回目(通算7日目)は、NotionRubyMapping の 2026-03-11 への対応を記録していきます。まずは、Block#append_block_children の after を position に変更していきます。

スクリプトの修正

まず、 append_block_children_append_after.sh を修正します。これまで after: block_id だった部分を position に変更しています。

#!/bin/sh
curl -X PATCH 'https://api.notion.com/v1/blocks/03f6460c26734af484b95de15082d84e/children' \
  -H 'Notion-Version: 2026-03-11' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"children":[{"type":"numbered_list_item","object":"block","numbered_list_item":{"rich_text":[{"type":"text","text":{"content":"Middle block","link":null},"plain_text":"Middle block","href":null}],"color":"default"}}], "position": {"type": "after_block", "after_block": {"id": "263f125b179e4e4f996a1eff812d9d3d"}}}'

make すると json が生成されます。

make
sh append_block_children_append_after.sh > append_block_children_append_after.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3341    0  3027  100   314   1782    184  0:00:01  0:00:01 --:--:--  1967
sleep 1

作成された json は以下のようになりました。

{
  "object": "list",
  "results": [
    {
      "object": "block",
      "id": "325d8e4e-98ab-8180-84fb-cc1756204848",
      "parent": {
        "type": "block_id",
        "block_id": "03f6460c-2673-4af4-84b9-5de15082d84e"
      },
      "created_time": "2026-03-16T11:51:00.000Z",
      "last_edited_time": "2026-03-16T11:51:00.000Z",
      "created_by": {
        "object": "user",
        "id": "40673a87-d8ed-41e0-aa55-7f0e8ace24cd"
      },
      "last_edited_by": {
        "object": "user",
        "id": "40673a87-d8ed-41e0-aa55-7f0e8ace24cd"
      },
      "has_children": false,
      "in_trash": false,
      "type": "numbered_list_item",
      "numbered_list_item": {
        "rich_text": [
          {
            "type": "text",
            "text": {
              "content": "Middle block",
              "link": null
            },
            "annotations": {
              "bold": false,
              "italic": false,
              "strikethrough": false,
              "underline": false,
              "code": false,
              "color": "default"
            },
            "plain_text": "Middle block",
            "href": null
          }
        ],
        "color": "default"
      }
    },
    {
      "object": "block",
      "id": "26dd8e4e-98ab-81dd-a004-fec6512815a6",
      "parent": {
        "type": "block_id",
        "block_id": "03f6460c-2673-4af4-84b9-5de15082d84e"
      },
      "created_time": "2025-09-13T06:06:00.000Z",
      "last_edited_time": "2025-09-13T06:06:00.000Z",
      "created_by": {
        "object": "user",
        "id": "019a87c7-d197-44a4-b19a-baa684400f81"
      },
      "last_edited_by": {
        "object": "user",
        "id": "019a87c7-d197-44a4-b19a-baa684400f81"
      },
      "has_children": false,
      "in_trash": false,
      "type": "numbered_list_item",
      "numbered_list_item": {
        "rich_text": [
          {
            "type": "text",
            "text": {
              "content": "Middle block",
              "link": null
            },
            "annotations": {
              "bold": false,
              "italic": false,
              "strikethrough": false,
              "underline": false,
              "code": false,
              "color": "default"
            },
            "plain_text": "Middle block",
            "href": null
          }
        ],
        "color": "default"
      }
    },
    {
      "object": "block",
      "id": "67c0e9bd-bbe4-456c-8731-27763d7fa580",
      "parent": {
        "type": "block_id",
        "block_id": "03f6460c-2673-4af4-84b9-5de15082d84e"
      },
      "created_time": "2023-07-12T12:20:00.000Z",
      "last_edited_time": "2023-07-12T12:20:00.000Z",
      "created_by": {
        "object": "user",
        "id": "40673a87-d8ed-41e0-aa55-7f0e8ace24cd"
      },
      "last_edited_by": {
        "object": "user",
        "id": "40673a87-d8ed-41e0-aa55-7f0e8ace24cd"
      },
      "has_children": false,
      "in_trash": false,
      "type": "numbered_list_item",
      "numbered_list_item": {
        "rich_text": [
          {
            "type": "text",
            "text": {
              "content": "Middle block",
              "link": null
            },
            "annotations": {
              "bold": false,
              "italic": false,
              "strikethrough": false,
              "underline": false,
              "code": false,
              "color": "default"
            },
            "plain_text": "Middle block",
            "href": null
          }
        ],
        "color": "default"
      }
    },
    {
      "object": "block",
      "id": "28b314c5-d2b5-4df8-8760-95b67a673d69",
      "parent": {
        "type": "block_id",
        "block_id": "03f6460c-2673-4af4-84b9-5de15082d84e"
      },
      "created_time": "2023-07-12T09:44:00.000Z",
      "last_edited_time": "2023-07-12T09:44:00.000Z",
      "created_by": {
        "object": "user",
        "id": "2200a911-6a96-44bb-bd38-6bfb1e01b9f6"
      },
      "last_edited_by": {
        "object": "user",
        "id": "2200a911-6a96-44bb-bd38-6bfb1e01b9f6"
      },
      "has_children": false,
      "in_trash": false,
      "type": "numbered_list_item",
      "numbered_list_item": {
        "rich_text": [
          {
            "type": "text",
            "text": {
              "content": "Last block",
              "link": null
            },
            "annotations": {
              "bold": false,
              "italic": false,
              "strikethrough": false,
              "underline": false,
              "code": false,
              "color": "default"
            },
            "plain_text": "Last block",
            "href": null
          }
        ],
        "color": "default"
      }
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "type": "block",
  "block": {},
  "request_id": "546c471d-477c-44ee-9a69-0da25822e711"
}

テストの修正

呼び出し側のテストを修正します。この中の APPEND_AFTER_ADDED_ID は新しく追加されたブロックの ID に変更しています。

    describe "append block children with after" do
      parent_id = TestConnection::APPEND_AFTER_PARENT_ID
      previous_id = TestConnection::APPEND_AFTER_PREVIOUS_ID
      append_block = NumberedListItemBlock.new "Middle block"
      let(:parent_block) { Block.find parent_id }
      let(:above_block) { Block.find previous_id }

      shared_examples "append_block_children_append_after" do
        context "dry_run" do
          it_behaves_like "dry run", :patch, :append_block_children_page_path, id: parent_id,
            json: {
              "children" => [append_block.block_json],
              "position" => {
                "type" => "after_block",
                "after_block" => {
                    "id" => previous_id,
                  },
                },
            }
        end

        context "create" do
          it { expect(block.id).to eq TestConnection::APPEND_AFTER_ADDED_ID }
        end
      end

      context "after option" do
        let(:dry_run) { parent_block.append_block_children append_block, position: previous_id, dry_run: true }
        let(:block) { parent_block.append_block_children append_block, position: previous_id }

        it_behaves_like "append_block_children_append_after"
      end

      context "append_after method" do
        let(:dry_run) { above_block.append_after append_block, dry_run: true }
        let(:block) { above_block.append_after append_block }

        it_behaves_like "append_block_children_append_after"
      end
    end

実装の修正

Base#append_block_children の after の部分を position に変更します。

    # @param [Array<Block>] blocks
    # @param [String, nil] position block id of previous block, page_start, or page_end
    # @param [Boolean] dry_run true if dry_run
    # @return [NotionRubyMapping::Block, String]
    # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#44bbf83d852c419485c5efe9fe1558fb
    # @see https://www.notion.so/hkob/Block-689ad4cbff50404d8a1baf67b6d6d78d#2c47f7fedae543cf8566389ba1677132
    def append_block_children(*blocks, position: nil, dry_run: false)
      raise StandardError, "This block can have no children." unless page? || (block? && can_have_children)

      only_one = blocks.length == 1
      json = {
        children: Array(blocks).map do |block|
          assert_parent_children_pair block
          block.block_json
        end,
      }
      if %w[page_start page_end].include? position
        json["position"] = {"type" => position}
      elsif position
        json["position"] = {"type" => "after_block", "after_block" => {"id" => position}}
      end
      if dry_run
        path = @nc.append_block_children_page_path(id)
        self.class.dry_run_script :patch, path, json
      else
        response = @nc.append_block_children_request @id, json
        raise StandardError, response unless response["results"]

        answers = response["results"].map { |sub_json| Block.create_from_json sub_json }
        only_one ? answers.first : answers
      end
    end

Block#append_after も after から position に変更しておきます。

    # @param [Boolean] dry_run true if dry_run
    # @return [NotionRubyMapping::Block, String]
    # @param [Array<Block>] blocks
    def append_after(*blocks, dry_run: false)
      parent.append_block_children(*blocks, position: id, dry_run: dry_run)
    end

WebMock の修正

実装したところ、API 呼び出しでエラーになりました。WebMock の修正をしていないためです。append_after の mock についても、position に修正しておきます。

    def append_after
      generate_stubs_sub :patch, :append_block_children, :append_block_children_block_path, {
        append_after: [
          APPEND_AFTER_PARENT_ID, 200,
          {
            "children" => [
              {
                "type" => "numbered_list_item",
                "object" => "block",
                "numbered_list_item" => {
                  "rich_text" => [
                    {
                      "type" => "text",
                      "text" => {
                        "content" => "Middle block",
                        "link" => nil,
                      },
                      "plain_text" => "Middle block",
                      "href" => nil,
                    },
                  ],
                  "color" => "default",
                },
              },
            ],
            "position" => {
              "type" => "after_block",
              "after_block" => {
                "id" => "263f125b179e4e4f996a1eff812d9d3d",
              },
            },
          }
        ],
      }
    end

テスト確認

これでテストが成功することを確認しました。

(中略)
  append block children with after
    after option
      behaves like append_block_children_append_after
        dry_run
          behaves like dry run
            is expected to eq "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/blocks/03f6460c26734af484b95de15082d84e/children...sition\":{\"type\":\"after_block\",\"after_block\":{\"id\":\"263f125b179e4e4f996a1eff812d9d3d\"}}}'"
        create
          is expected to eq "325d8e4e98ab818084fbcc1756204848"
    append_after method
      behaves like append_block_children_append_after
        dry_run
          behaves like dry run
            is expected to eq "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/blocks/03f6460c26734af484b95de15082d84e/children...sition\":{\"type\":\"after_block\",\"after_block\":{\"id\":\"263f125b179e4e4f996a1eff812d9d3d\"}}}'"
        create
          is expected to eq "325d8e4e98ab818084fbcc1756204848"
(後略)

Finished in 0.08157 seconds (files took 0.35474 seconds to load)
94 examples, 0 failures

おわりに

とりあえず、これまで after で呼び出していたテストを position に変更するだけを実施してみました。明日は page_start, page_end へのブロック追加のテストを追加します。実装は書いてしまっているので、あくまでテストで確認するだけということになります。

hkob.notion.site