2022年1月31日月曜日

Sinatra の Extension 開発超入門

Sinatra の Extension 開発超入門

概要

Sinatra の拡張機能の開発入門としてとりあえず動作する拡張を作ってみたいと思います

また今回作成する拡張はヘルパーとして作成します

環境

  • macOS 11.6.2
  • Ruby 3.0.3p157
  • Sinatra 2.1.0

拡張の作成

拡張は Sinatra モジュール配下に作成します
今回はリクエストのヘッダを出力するような拡張にしてみます

  • vim test_ext.rb
require 'sinatra/base'

module Sinatra
  module LoggingHeader
    def hputs
      headers = request.env.select { |k, v| k.start_with?('HTTP_') }
      logger.info headers
    end
  end

  helpers LoggingHeader
end

LoggingHeader は拡張の名前になります
Sinatra::Base 配下で使用できるオブジェクトなどは拡張配下でも参照することができます
上記で言えば request オブジェクトを参照しています

作成した拡張機能を使う

  • vim test.rb
require 'sinatra'
require './test_ext'

get '/' do
  hputs
  'ok'
end

Sinatra の DSL をそのまま使うのであれば require するだけで拡張用のメソッドが使えるようになっています

クラシックスタイルで拡張を使うのであれば更に helpers Sinatra::LoggingHeader を記載します

拡張を使う場合はこれだけで OK です

拡張機能開発時にはルールがある

詳細は公式のドキュメントを確認してください
http://sinatrarb.com/extensions.html

Sinatar::Base クラスには直接変更を入れないでくださいやクラシックスタイルでもちゃんと使えるように記載する必要があるなどが書かれています

また今回はヘルパーとして作成しましたが Sinatra の DSL を拡張することもできます
その場合は helper ではなく register として呼び出す必要があるので注意してください

あとは gem として公開する

作成した拡張を公開するのであれば gem として作成してあげる必要があります
ディレクトリ構成などは公式に記載してあります

sinatra-fu
|-- README
|-- LICENSE
|-- Rakefile
|-- lib
|   `-- sinatra
|       `-- fu.rb
|-- test
|   `-- spec_sinatra_fu.rb
`-- sinatra-fu.gemspec

最後に

Sinatra の拡張機能を開発する方法を紹介しました

ルールがあるのでそれだけしっかりと守りましょう
Rubygems で公開する場合はディレクトリ構成なども守りましょう

参考サイト

0 件のコメント:

コメントを投稿