読者です 読者をやめる 読者になる 読者になる

Padrino 0.12.3 ( と padrino-contrib 0.2.0 ) がリリースされました

変更内容としては、ルーターリファクタリング・リローダーの改善、その他いくつかのバグ修正なのですが、ちょっと注意が必要そうな変更が多そうだったので重要そうな変更点をまとめておきます。

( ちょっと非互換の内容が多いから 0.13.0 にしちゃっても良かったんじゃないかな...
( あと Ruby 1.9.3 以上が必要なのってこれより前からだったっけ?

非推奨となったメソッドと非互換の変更

  • Padrino::Application#load_paths
  • Padrino.load_paths

Padrino::Application#prerequisites を使用するように警告が表示され、空配列が戻されるようになりました

開発時のリロード対象にしたいものは prerequisites にパスを入れていくことになります(Dir.glob で探索される)

  • Padrino.set_load_paths

$LOAD_PATH を使用するように警告が表示され、空配列が戻されるようになりました

  • パンくずリストを便利に使える breadcrumbs ヘルパーが padrino-contrib に移されました

0.12.3以降でこれまで同様に breadcrumbs ヘルパーを使いたい場合は require 'padrino-contrib/helpers/breadcrumbs' とする必要があります これに合わせて padrino-contrib のバージョンも 0.2.0 に上がっています

  • Padrino::Admin::AccessControl を明示的に use していない場合には PadrinoAdmin の I18n 用辞書ファイルを自動的に読み込まないようになりました

  • Padrino::Admin に含まれる I18n 用辞書ファイルから activemodel(activerecord).errors.messages がごっそりと削除されました

  • 未使用だった Padrino::Admin::Utils::Crypt が削除されました

リローダーの改善

  • リロード対象から外部のライブラリを除外する処理が修正されました

ルーターリファクタリング

  • padrino-core/lib/padrino-core/application/routing.rb から以下の機能が別ファイルへと分離されました。

  • HttpRouterの拡張 : padrino-core/lib/padrino-core/ext/http_router.rb

  • Sinatra の拡張 : padrino-core/lib/padrino-core/ext/sinatra.rb

  • Padrino::Filter : padrino-core/lib/padrino-core/filter.rb

  • その他、コードをキレイにするための変更がいくつかありました

ジェネレータの改善

  • --tiny オプションでプロジェクトを作成する際に、生成される helper ファイルでモジュール名が出力されていない不具合が修正されました
  • --tiny オプションでプロジェクトを作成する際に、テスト用コンポーネントが指定されている場合にはテスト用のファイルが生成されるようになりました
  • app ジェネレータと model ジェネレータに --force オプションが追加されました。このオプションを付けない場合、既に対象のファイルが存在していた場合には操作が中断されますが、--force オプションを付けることで上書きするか確認されるようになります
  • controller ジェネレータに --no-helper オプションが追加されました。このオプションを付けることで helper 用のファイル生成をスキップすることができます
  • project ジェネレータで、log, tmp ディレクトリが作成されるようになりました(--gem オプションを付けた場合は除く)
  • project ジェネレータで、bin ディレクトリが作成され、プロジェクト名と同名の起動スクリプトが生成されるようになりました
$ padrino g project sample_project
$ cd sample_project
$ bundle install
$ ./bin/sample_project
=> Padrino/0.12.3 has taken the stage development at http://127.0.0.1:3000
[2014-08-14 18:54:50] INFO  WEBrick 1.3.1
[2014-08-14 18:54:50] INFO  ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0]
[2014-08-14 18:54:50] INFO  WEBrick::HTTPServer#start: pid=75724 port=3000

ルーティングの with オプションに文字列が渡せるようになった

Drugs::App.controller :'v9/medicines' do
  # works as is:
  get :index do; end
  get :prescribed_by_medic, :with => [ :medic_id ] do; end
  # works as is but needs a test to lock this feature:
  get :show, '', :with => [ :id ] do; end
  # needs cosmetic patch to pass verb arguments to Router around Sinatra:
  post :bulk_create do; end
  post :create, '' do; end
  put :update, '', :with => [ :id ] do; end
  # needs small patch to :with syntax to allow constant strings:
  put :update_chronic_state, '', :with => [ :id, 'update_chronic_state' ] do; end
  delete :stop_treatment, '', :with => [ :id, 'stop_treatment' ] do; end
  delete :destroy, '', :with => [ :id ] do; end
end
URL                                       REQUEST  PATH
    (:v9/medicines, :index)                     GET    /v9/medicines
    (:v9/medicines, :prescribed_by_medic)       GET    /v9/medicines/prescribed_by_medic/:medic_id
    (:v9/medicines, :show)                      GET    /v9/medicines/:id
    (:v9/medicines, :bulk_create)              POST    /v9/medicines/bulk_create
    (:v9/medicines, :create)                   POST    /v9/medicines
    (:v9/medicines, :update)                    PUT    /v9/medicines/:id
    (:v9/medicines, :update_chronic_state)      PUT    /v9/medicines/:id/update_chronic_state
    (:v9/medicines, :stop_treatment)          DELETE   /v9/medicines/:id/stop_treatment
    (:v9/medicines, :destroy)                 DELETE   /v9/medicines/:id

Padrino Commit Oct 23, 2013

Ortuna Merge pull request #1470 from padrino/issue-1405-param-hash

#1470のマージコミットです。

Ortuna issue #1405 - params hash keys

params の値取得時のキー指定が、文字列にも対応しました。

patch :edit, map: '/:id' do
  # something…
end

上記のような場合、パラメータ id の値は params[:id]params['id'] のどちらでも取得できるようになりました。

この対応のために、ActiveSupport の HashWithIndifferentAccess が require されてます。

ujifgc Merge pull request #1472 from padrino/fix-incorrect-params2

#1472のマージコミットです。

namusyaka Skip the :path_traversal protection, fixes #1391.

rack-protection の PathTraversal が除外されました。

URLエンコードされたスラッシュ(%2F)は、パスとは区別して解釈したいのに、rack-protection の 1.5.1 を使用すると、スラッシュに変換されてしまい、区別ができないという問題への対応です。

関連: http://tyabe.hatenablog.com/entry/2013/09/11/000000

ただ、既存のアプリケーションは config/apps.rb で設定している方で PathTraversal が効いちゃう気がするんですよね…。

Padrino Commit Oct 17, 2013

ujifgc restore untested $LOAD_PATH behavior, add tests, fixes #1463

いくつかのディレクトリが $LOAD_PATH から除外されていた不具合が修正されました。

ujifgc cache content_type, fixes #1462

cache を使った場合に Content-Type が常に text/html となっていた不具合が修正されました。

ujifgc log 404 error of unmounted path, fixes #1459

マウントされていないアプリケーションへのリクエストがログに記録されない不具合が修正されました。

nesquena Merge pull request #1455 from namusyaka/add-steak

#1455のマージコミットです。

eturk steak generator written, tests a work in progress.

テストコンポーネントとして Steak が使える様になりました。

ujifgc Merge pull request #1467 from minad/cache-examples

#1467のマージコミットです。

minad provide more examples for the instantiation of the cache stores

PadrinoCache の README とコメントに追記がありました。主に使用例についての記述が追加されました。

ujifgc Merge pull request #1466 from padrino/fix-sinatra-edge

#1466のマージコミットです。

namusyaka Change request.accepts to an empty array if request.accepts is */*.

最新の Sinatra を使っていて、不明な Content-Type のファイルにリクエストが来た場合に RuntimeError となる不具合が修正されました。

ujifgc Merge pull request #1457 from padrino/cleanup-helpers

#1457のマージコミットです。

※個別のコミットは数が多いので省略

padrino-helpers のリファクタリングです。

また、select_tag のオプション指定で配列を使った場合に、無効とするオプションに対する指定がハッシュを使うように変更されました。

変更前('Green'を無効にしている):

[['Green', 'green1', true], ['Blue', 'blue1'], ['Black', "black1"]]

変更後('Green'を無効にしている):

[['Green', 'green1', {:disabled => true}], ['Blue', 'blue1'], ['Black', "black1"]]

さらに、error_message_on メソッドから OHM のみ I18n を使ってエラーメッセージを取得している部分が削除されました。

nesquena Merge pull request #1468 from padrino/upgrade-documentations

#1468のマージコミットです。

namusyaka Should use = instead of - if using slim or haml.[ci skip]
namushaka Add steak to test components.[ci skip]

README が追記・修正されました。

Padrino Commit Oct 16, 2013

ujifgc Merge pull request #1452 from padrino/padrino-start-accepts-handler-options

#1452のマージコミットです。

dariocravero Modified padrino start to take an extra --options (-O) parameter
dariocravero Made patch more readable thanks to @Ortuna's comment comment https://github.com/padrino/padrino-framework/pull/1452/files#r6968956

padrino start コマンドのオプションに —-options(省略形は -O) と —-server_options が追加されました。

—-options を使って Rack ハンドラにオプションを渡せるようになりました。

puma を使っている場合なら以下のようにすることで使用するスレッド数を指定できます。

$ padrino s -O Threads=3:16

—-server_options を渡すと Rack ハンドラがサポートしているオプションが表示されます。

$ padrino s --server_options
Server-specific options for Rack::Handler::Puma:
  -O Threads=MIN:MAX       min:max threads to use (default 0:16)
  -O Quiet                 Don't report each request

ただし、 Rack ハンドラに valid_options メソッドが実装されている場合のみで、PORT と Host オプションは除外されます。

ざっと確認したところ、WEBrick と Thin は PORT と HOST オプションしかサポートしていないので何も表示されませんでした…。

ujifgc do not sort dependencies, fixes #1458

依存ファイルの読み込み順が修正されました。

Padrino Commit Oct 15, 2013

ujifgc Merge pull request #1018 from minad/moneta-replace

#1018のマージコミットです。

minad replace Padrino::Cache::Store with Moneta

Padrino::Cache のコア実装が moneta にリプレースされました。

これにより、キャッシュ・ストアの指定方法が後方互換のない変更となっているので注意が必要です。

アプリケーション内で使用する場合の例として、これまで

# set :cache, Padrino::Cache::Store::Memcache.new(::Memcached.new('127.0.0.1:11211', :exception_retry_limit => 1))
# set :cache, Padrino::Cache::Store::Memcache.new(::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1))
# set :cache, Padrino::Cache::Store::Redis.new(::Redis.new(:host => '127.0.0.1', :port => 6379, :db => 0))
# set :cache, Padrino::Cache::Store::Memory.new(50)
set :cache, Padrino::Cache::Store::File.new(Padrino.root('tmp', app_name, 'cache')

MyApp.cache.set('val', 'test', :expires_in => 30)
MyApp.cache.get('val') # => 'test'
MyApp.cache.delete('val')
MyApp.cache.flush

としていたのが

# set :cache, Padrino::Cache.new(:Memcached, :server => '127.0.0.1:11211', :exception_retry_limit => 1)
# set :cache, Padrino::Cache.new(:MemcachedDalli, :server => '127.0.0.1:11211', :exception_retry_limit => 1)
# set :cache, Padrino::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0)
# set :cache, Padrino::Cache.new(:LRUHash, :maxsize => 50)
set :cache, Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache'))

MyApp.cache.store('val', 'test', :expires => 30)
# expires を指定しない場合は
MyApp.cache['val'] = 'test'
MyApp.cache['val'] # => 'test'
MyApp.cache.delete('val')
MyApp.cache.clear

となります。

expires_in オプションと set, get, flush メソッドは引き続き使用できますが WARN が出力されます。

Padrino Commit Oct 13, 2013

ujifgc Merge pull request #1448 from padrino/cleanup-application

#1448のマージコミットです。

※個別のコミットは数が多いので省略

padrino-core のリファクタリングです。メソッドの抽出など可読性が改善されました。

ujifgc Merge pull request #1443 from padrino/dont_override_session_id_admin_if_set

#1443のマージコミットです。

dariocravero Don't override :session_id setting if it's being set somewhere else when the admin starts, see: https://github.com/padrino/padrino-framework/issues/500#issuecomment-16836189

PadrinoAdrmin で使われている :session_id がシステム設定値で上書きされてしまう問題が解消されました。
これにより、PadrinoAdmin 以外のアプリケーションと共通のセッション情報を扱える様になりました。

Padrino Commit Oct 11, 2013

ujifgc Merge pull request #1449 from padrino/fix-loading-order

#1449のマージコミットです。

dariocravero Fixed the loading order of an app's dependencies.
dariocravero Added @ujifgc's suggestion #1449#issuecomment-26145420 to launch the circular loader.

依存ファイルパスの読み込み方法が修正され、config/apps.rb の読み込み順が一番最後に変更されました。

これにより、config/apps.rb の中で外部ライブラリの初期化処理等が書けるようになりました。