diff --git a/lib/cask/artifact.rb b/lib/cask/artifact.rb index 0ca666af28..efcd9ba7c2 100644 --- a/lib/cask/artifact.rb +++ b/lib/cask/artifact.rb @@ -7,6 +7,7 @@ require 'cask/artifact/hardlinked' require 'cask/artifact/app' require 'cask/artifact/binary' require 'cask/artifact/after_block' +require 'cask/artifact/before_block' require 'cask/artifact/colorpicker' require 'cask/artifact/font' require 'cask/artifact/nested_container' @@ -27,6 +28,7 @@ module Cask::Artifact # def self.artifacts [ + Cask::Artifact::BeforeBlock, Cask::Artifact::NestedContainer, Cask::Artifact::App, Cask::Artifact::Colorpicker, diff --git a/lib/cask/artifact/before_block.rb b/lib/cask/artifact/before_block.rb new file mode 100644 index 0000000000..a9eaa8bc33 --- /dev/null +++ b/lib/cask/artifact/before_block.rb @@ -0,0 +1,14 @@ +class Cask::Artifact::BeforeBlock < Cask::Artifact::Base + def self.me?(cask) + cask.artifacts[:before_install].any? || + cask.artifacts[:before_uninstall].any? + end + + def install + @cask.artifacts[:before_install].each { |block| @cask.instance_eval &block } + end + + def uninstall + @cask.artifacts[:before_uninstall].each { |block| @cask.instance_eval &block } + end +end diff --git a/lib/cask/dsl.rb b/lib/cask/dsl.rb index 14d6d63b81..6865981975 100644 --- a/lib/cask/dsl.rb +++ b/lib/cask/dsl.rb @@ -89,7 +89,9 @@ module Cask::DSL ARTIFACT_BLOCK_TYPES = [ :after_install, - :after_uninstall + :after_uninstall, + :before_install, + :before_uninstall, ] ARTIFACT_BLOCK_TYPES.each do |type| diff --git a/test/cask/artifact/before_block_test.rb b/test/cask/artifact/before_block_test.rb new file mode 100644 index 0000000000..e80bec0771 --- /dev/null +++ b/test/cask/artifact/before_block_test.rb @@ -0,0 +1,45 @@ +require 'test_helper' + +describe Cask::Artifact::BeforeBlock do + describe 'install' do + it 'calls the specified block before installing' do + called = false + yielded_arg = nil + + CaskWithBeforeInstall = Class.new(Cask) + CaskWithBeforeInstall.class_eval do + before_install do |c| + called = true + yielded_arg = c + end + end + + cask = CaskWithBeforeInstall.new + Cask::Artifact::BeforeBlock.new(cask).install + + called.must_equal true + yielded_arg.must_equal cask + end + end + + describe 'uninstall' do + it 'calls the specified block before uninstalling, passing the cask' do + called = false + yielded_arg = nil + + CaskWithBeforeUninstall = Class.new(Cask) + CaskWithBeforeUninstall.class_eval do + before_uninstall do |c| + called = true + yielded_arg = c + end + end + + cask = CaskWithBeforeUninstall.new + Cask::Artifact::BeforeBlock.new(cask).uninstall + + called.must_equal true + yielded_arg.must_equal cask + end + end +end