5 changed files with 270 additions and 0 deletions
@ -0,0 +1,101 @@ |
|||||
|
class Cask::CLI::Alfred |
||||
|
def self.run(*args) |
||||
|
subcommand = args.first |
||||
|
|
||||
|
if args.length > 1 && args.last.is_a?(Class) |
||||
|
@system_command = args.last |
||||
|
else |
||||
|
@system_command = Cask::SystemCommand |
||||
|
end |
||||
|
|
||||
|
case subcommand |
||||
|
when "link" then link |
||||
|
when "unlink" then unlink |
||||
|
when "status" then status |
||||
|
else |
||||
|
alfred_help |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
def self.alfred_help |
||||
|
ohai 'brew cask alfred', <<-ALFREDHELP.undent |
||||
|
manages integration with Alfred; allows applications installed with |
||||
|
homebrew cask to be launched by Alfred by adding the Caskroom to Alfreds |
||||
|
search paths |
||||
|
|
||||
|
subcommands: |
||||
|
status - reports whether Alfred is linked |
||||
|
link - adds Caskroom to alfred search paths |
||||
|
link - removes Cakroom from Alfred search paths |
||||
|
ALFREDHELP |
||||
|
end |
||||
|
|
||||
|
def self.link |
||||
|
if !alfred_installed? |
||||
|
opoo "Could not find any Alfred scopes, Alfred is probably not installed." |
||||
|
elsif linked? |
||||
|
opoo "Alfred is already linked to homebrew-cask." |
||||
|
else |
||||
|
save_alfred_scopes(alfred_scopes << Cask.caskroom) |
||||
|
ohai "Successfully linked Alfred to homebrew-cask." |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
def self.unlink |
||||
|
if !alfred_installed? |
||||
|
opoo "Could not find any Alfred scopes, Alfred is probably not installed." |
||||
|
elsif !linked? |
||||
|
opoo "Alfred is already unlinked from homebrew-cask." |
||||
|
else |
||||
|
save_alfred_scopes(alfred_scopes.reject { |x| x == Cask.caskroom.to_s }) |
||||
|
ohai "Successfully unlinked Alfred from homebrew-cask." |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
def self.status |
||||
|
if !alfred_installed? |
||||
|
opoo "Could not find any Alfred scopes, Alfred is probably not installed." |
||||
|
elsif linked? |
||||
|
ohai "Alfred is happily linked to homebrew-cask!" |
||||
|
else |
||||
|
ohai "Alfred is not linked to homebrew-cask." |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
def self.help |
||||
|
"used to modify Alfred's scope to include the Caskroom" |
||||
|
end |
||||
|
|
||||
|
def self.save_alfred_scopes(scopes) |
||||
|
scopes_arg = "(#{scopes.join(",")})" |
||||
|
@system_command.run("defaults write com.alfredapp.Alfred scope.paths '#{scopes_arg}'") |
||||
|
end |
||||
|
|
||||
|
def self.alfred_installed? |
||||
|
!alfred_scopes.empty? |
||||
|
end |
||||
|
|
||||
|
def self.linked? |
||||
|
alfred_scopes.include?(Cask.caskroom.to_s) |
||||
|
end |
||||
|
|
||||
|
# output looks like this: |
||||
|
# ( |
||||
|
# "/some/path", |
||||
|
# "/other/path" |
||||
|
# ) |
||||
|
# |
||||
|
# and we would like %w[/some/path /other/path] |
||||
|
SCOPE_REGEXP = /^\s*"(.*)",?$/ |
||||
|
|
||||
|
def self.alfred_scopes |
||||
|
alfred_preference("scope.paths").map do |line| |
||||
|
matchdata = line.match(SCOPE_REGEXP) |
||||
|
matchdata ? matchdata.captures.first : nil |
||||
|
end.compact |
||||
|
end |
||||
|
|
||||
|
def self.alfred_preference(key) |
||||
|
@system_command.run("defaults read com.alfredapp.Alfred #{key}") |
||||
|
end |
||||
|
end |
@ -0,0 +1,5 @@ |
|||||
|
class Cask::SystemCommand |
||||
|
def self.run(command) |
||||
|
%x(#{command}).split("\n") |
||||
|
end |
||||
|
end |
@ -0,0 +1,126 @@ |
|||||
|
require 'test_helper' |
||||
|
|
||||
|
def _fake_alfred_scope_paths(response) |
||||
|
Cask::FakeSystemCommand.fake_response_for('defaults read com.alfredapp.Alfred scope.paths', response) |
||||
|
end |
||||
|
|
||||
|
describe Cask::CLI::Alfred do |
||||
|
describe "status" do |
||||
|
it "properly reports when alfred is not installed" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
2013-04-28 12:55:52.417 defaults[69808:707] |
||||
|
The domain/default pair of (com.alfredapp.Alfred, scope.paths) does not exist |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('status', Cask::FakeSystemCommand) |
||||
|
}, "Warning: Could not find any Alfred scopes, Alfred is probably not installed.") |
||||
|
end |
||||
|
|
||||
|
it "properly reports when alfred is installed but unlinked" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
( |
||||
|
"/Applications", |
||||
|
"/Library/PreferencePanes", |
||||
|
"/System/Library/PreferencePanes" |
||||
|
) |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('status', Cask::FakeSystemCommand) |
||||
|
}, "==> Alfred is not linked to homebrew-cask.") |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
describe "link" do |
||||
|
it "properly reports when alfred is not installed" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
2013-04-28 12:55:52.417 defaults[69808:707] |
||||
|
The domain/default pair of (com.alfredapp.Alfred, scope.paths) does not exist |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('link', Cask::FakeSystemCommand) |
||||
|
}, "Warning: Could not find any Alfred scopes, Alfred is probably not installed.") |
||||
|
end |
||||
|
|
||||
|
it "warns when alfred is already linked" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
( |
||||
|
"/Applications", |
||||
|
"/Library/PreferencePanes", |
||||
|
"#{Cask.caskroom}", |
||||
|
"/System/Library/PreferencePanes" |
||||
|
) |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('link', Cask::FakeSystemCommand) |
||||
|
}, "Warning: Alfred is already linked to homebrew-cask.") |
||||
|
end |
||||
|
|
||||
|
it "links when it needs to" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
( |
||||
|
"/Applications", |
||||
|
"/Library/PreferencePanes", |
||||
|
"/System/Library/PreferencePanes" |
||||
|
) |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
Cask::FakeSystemCommand.fake_response_for( |
||||
|
"defaults write com.alfredapp.Alfred scope.paths '(/Applications,/Library/PreferencePanes,/System/Library/PreferencePanes,#{Cask.caskroom})'" |
||||
|
) |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('link', Cask::FakeSystemCommand) |
||||
|
}, "==> Successfully linked Alfred to homebrew-cask.") |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
describe "unlink" do |
||||
|
it "properly reports when alfred is not installed" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
2013-04-28 12:55:52.417 defaults[69808:707] |
||||
|
The domain/default pair of (com.alfredapp.Alfred, scope.paths) does not exist |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('unlink', Cask::FakeSystemCommand) |
||||
|
}, "Warning: Could not find any Alfred scopes, Alfred is probably not installed.") |
||||
|
end |
||||
|
|
||||
|
it "warns when alfred is already unlinked" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
( |
||||
|
"/Applications", |
||||
|
"/Library/PreferencePanes", |
||||
|
"/System/Library/PreferencePanes" |
||||
|
) |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('unlink', Cask::FakeSystemCommand) |
||||
|
}, "Warning: Alfred is already unlinked from homebrew-cask.") |
||||
|
end |
||||
|
|
||||
|
it "unlinks when it needs to" do |
||||
|
_fake_alfred_scope_paths <<-SCOPE_RESPONSE.undent |
||||
|
( |
||||
|
"/Applications", |
||||
|
"/Library/PreferencePanes", |
||||
|
"#{Cask.caskroom}", |
||||
|
"/System/Library/PreferencePanes" |
||||
|
) |
||||
|
SCOPE_RESPONSE |
||||
|
|
||||
|
Cask::FakeSystemCommand.fake_response_for( |
||||
|
"defaults write com.alfredapp.Alfred scope.paths '(/Applications,/Library/PreferencePanes,/System/Library/PreferencePanes)'" |
||||
|
) |
||||
|
|
||||
|
TestHelper.must_output(self, lambda { |
||||
|
Cask::CLI::Alfred.run('unlink', Cask::FakeSystemCommand) |
||||
|
}, "==> Successfully unlinked Alfred from homebrew-cask.") |
||||
|
end |
||||
|
end |
||||
|
end |
@ -0,0 +1,37 @@ |
|||||
|
class Cask::FakeSystemCommand |
||||
|
def self.fake_response_for(command, response='') |
||||
|
@responses[command] = response |
||||
|
end |
||||
|
|
||||
|
def self.init |
||||
|
@responses = {} |
||||
|
end |
||||
|
|
||||
|
def self.clear |
||||
|
@responses = {} |
||||
|
end |
||||
|
|
||||
|
def self.run(command) |
||||
|
@responses ||= {} |
||||
|
unless @responses.key?(command) |
||||
|
fail("no response faked for #{command.inspect}") |
||||
|
end |
||||
|
@responses[command].split("\n") |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
module FakeSystemCommandHooks |
||||
|
def before_setup |
||||
|
Cask::FakeSystemCommand.init |
||||
|
super |
||||
|
end |
||||
|
|
||||
|
def after_teardown |
||||
|
super |
||||
|
Cask::FakeSystemCommand.clear |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
class MiniTest::Spec |
||||
|
include FakeSystemCommandHooks |
||||
|
end |
Loading…
Reference in new issue