2016-08-06 9 views
1

基本的には、特定の依存関係が古くなったときに何らかの形でテストに失敗するような宝石を作ろうとしています。テストフレームワークでは、Gem.loaded_specs( "foo")がgem fooの仕様を返すように、Gemから簡単に切り捨てることができます。私が探しているのは、フィクスチャGemfileを提供し、ロックファイルを解析する方法です。BundlerでGemfile.lockを解析する

私はGem.loaded_specsを使用するとき、それはどういうわけか魔法のようにどのGemfileを使うべきかを知っています。私はそれをどのように別のgemfile(ie:fixture)に送りますか?

私は誰かが「バンドラを使用」に述べた知っていて、それが理にかなっているが、私はこれを行う宝石のための私のコードで:

gem_here = Gem.loaded_specs[gem_name] 
gem_here.nil? ? :not_in_bundle : gem_here.version.to_s 

私は私の治具Gemfileはなく、現在のプロジェクトで、この作業をする必要があるgemfile 。

これは意味がありますか?これがあいまいなのならお手数です。

注:私はこれをCLI経由で行うつもりはありません。もし私ができるなら、私はプログラム的な(すなわち:ルビーapi)メソッドを使用したいと思います。

編集:

私は今、元のこの種のつもり:

gem_here = Bundler.load.specs.detect do |specs| 
    specs.name == gem_name 
end 
gem_here.nil? ? :not_in_bundle : gem_here.version.to_s 
+0

ない直接的な答えが、あなたは何を見つけることができますhttps://github.com/appfolio/gemsuranceのソースでの必要性 –

+0

@PhilipHallstromありがとう!それは実際に多くの助けになりました。私はそれに到達すれば私は答えを投稿しますが、これまでのBundler.loadはBundler :: SharedHelpers.default_gemfile – apanzerj

+0

に私を導いています。私はちょうど真似をして正規表現を使用してファイルを解析する必要があります。偉大な解決策ではなく、最も速く/最も直接的に解析する方法です。 :-( – apanzerj

答えて

2

それはYAMLですが、重量物の持ち上げ(依存関係の解決)を行うにはバンドラーのAPIを使用するようにしてください。

Bundler::LockfileParser.new(Bundler.read_file(Bundler.default_lockfile))

その後、すべてのランタイムおよび/または開発の依存関係を訪問するgemspecsとロックファイルを使用します。特定の宝石用ランタイム/開発DEPSはRubyGemsのJSONのAPI https://api.rubygems.org/api/v2/rubygems/rails/versions/5.0.0.1.json

注意(contribのニーズ、現在は文書化されていない)を介して利用できます。バンドラー2.0 Gemfile.lock - >gems.locked

+0

ありがとうございました!これは基本的に私が探していたものなので、特定のタイプのGemfileに対してテストを実行することができました。 – apanzerj

関連する問題