Skip to content

Commit cd3825c

Browse files
ccutrerhsbt
authored andcommitted
Add bundler before/after eval hooks for plugins
1 parent 57f9870 commit cd3825c

3 files changed

Lines changed: 67 additions & 1 deletion

File tree

bundler/lib/bundler/definition.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ def self.build(gemfile, lockfile, unlock)
3737

3838
raise GemfileNotFound, "#{gemfile} not found" unless gemfile.file?
3939

40-
Dsl.evaluate(gemfile, lockfile, unlock)
40+
Plugin.hook(Plugin::Events::GEM_BEFORE_EVAL, gemfile, lockfile)
41+
Dsl.evaluate(gemfile, lockfile, unlock).tap do |definition|
42+
Plugin.hook(Plugin::Events::GEM_AFTER_EVAL, definition)
43+
end
4144
end
4245

4346
#

bundler/lib/bundler/plugin/events.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ def self.defined_event?(event)
8080
# Includes an Array of Bundler::Dependency objects.
8181
# GEM_AFTER_REQUIRE_ALL = "after-require-all"
8282
define :GEM_AFTER_REQUIRE_ALL, "after-require-all"
83+
84+
# @!parse
85+
# A hook called before the Gemfile is evaluated
86+
# Includes the Gemfile path and the Lockfile path
87+
# GEM_BEFORE_EVAL = "before-eval"
88+
define :GEM_BEFORE_EVAL, "before-eval"
89+
90+
# @!parse
91+
# A hook called after the Gemfile is evaluated
92+
# Includes a Bundler::Definition
93+
# GEM_AFTER_EVAL = "after-eval"
94+
define :GEM_AFTER_EVAL, "after-eval"
8395
end
8496
end
8597
end

spec/plugins/hook_spec.rb

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,57 @@
193193
end
194194
end
195195

196+
context "before-eval hook" do
197+
before do
198+
build_repo2 do
199+
build_plugin "before-eval-plugin" do |s|
200+
s.write "plugins.rb", <<-RUBY
201+
Bundler::Plugin::API.hook Bundler::Plugin::Events::GEM_BEFORE_EVAL do |gemfile, lockfile|
202+
puts "hooked eval start of \#{File.basename(gemfile)} to \#{File.basename(lockfile)}"
203+
end
204+
RUBY
205+
end
206+
end
207+
208+
bundle "plugin install before-eval-plugin --source https://gem.repo2"
209+
end
210+
211+
it "runs before the Gemfile is evaluated" do
212+
install_gemfile <<-G
213+
source "https://gem.repo1"
214+
gem "rake"
215+
G
216+
217+
expect(out).to include "hooked eval start of Gemfile to Gemfile.lock"
218+
end
219+
end
220+
221+
context "after-eval hook" do
222+
before do
223+
build_repo2 do
224+
build_plugin "after-eval-plugin" do |s|
225+
s.write "plugins.rb", <<-RUBY
226+
Bundler::Plugin::API.hook Bundler::Plugin::Events::GEM_AFTER_EVAL do |defn|
227+
puts "hooked eval after with gems \#{defn.dependencies.map(&:name).join(", ")}"
228+
end
229+
RUBY
230+
end
231+
end
232+
233+
bundle "plugin install after-eval-plugin --source https://gem.repo2"
234+
end
235+
236+
it "runs after the Gemfile is evaluated" do
237+
install_gemfile <<-G
238+
source "https://gem.repo1"
239+
gem "myrack"
240+
gem "rake"
241+
G
242+
243+
expect(out).to include "hooked eval after with gems myrack, rake"
244+
end
245+
end
246+
196247
def install_gemfile_and_bundler_require
197248
install_gemfile <<-G
198249
source "https://gem.repo1"

0 commit comments

Comments
 (0)