add bona fide `brew cask create` command

the create command opens up an editor with template to get started

remove --create override flag from `brew cask edit`

hopefully this will be more straightforward for contributors

refs #306
This commit is contained in:
phinze 2013-05-11 19:20:07 -05:00
parent 5b22534368
commit fed2824c7f
5 changed files with 111 additions and 9 deletions

View File

@ -0,0 +1,34 @@
module Cask::CLI::Create
def self.run(*arguments)
cask_name, *_ = *arguments
cask_path = Cask.path(cask_name)
if cask_path.exist?
raise CaskAlreadyCreatedError.new cask_name
end
File.open(cask_path, 'w') do |f|
f.write template(cask_name)
end
exec_editor cask_path
end
def self.template(cask_name);
cask_class = cask_name.split('-').map(&:capitalize).join
<<-EOS.undent
class #{cask_class} < Cask
url ''
homepage ''
version ''
sha1 ''
link :app, ''
end
EOS
end
def self.help
"creates a cask of the given name and opens it in an editor"
end
end

View File

@ -2,8 +2,8 @@ module Cask::CLI::Edit
def self.run(*arguments)
cask_name, *args = *arguments
cask_path = Cask.path(cask_name)
unless cask_path.exist? || args.include?('--create')
raise CaskUnavailableError, "#{cask_name}, add --create to make a new cask with this name"
unless cask_path.exist?
raise CaskUnavailableError, "#{cask_name}, use `brew cask create #{cask_name}` to make a new cask with this name"
end
exec_editor cask_path
end

View File

@ -19,3 +19,14 @@ class CaskUnavailableError < RuntimeError
"No available cask for #{name}"
end
end
class CaskAlreadyCreatedError < RuntimeError
attr_reader :name
def initialize name
@name = name
end
def to_s
"Cask for #{name} already exists. Use `brew cask edit #{name}` to see it."
end
end

64
test/cli/create_test.rb Normal file
View File

@ -0,0 +1,64 @@
require 'test_helper'
module RecordCreateorCalls
def exec_editor(*command)
editor_commands << command
end
def reset!
@editor_commands = []
end
def editor_commands
@editor_commands ||= []
end
end
module Cask::CLI::Create
extend RecordCreateorCalls
end
describe Cask::CLI::Create do
before { Cask::CLI::Create.reset! }
after {
%w[ new-cask additional-cask another-cask ].each do |cask|
path = Cask.path(cask)
path.delete if path.exist?
end
}
it 'opens the editor for the specified cask' do
Cask::CLI::Create.run('new-cask')
Cask::CLI::Create.editor_commands.must_equal [
[Cask.path('new-cask')]
]
end
it 'drops a template down for the specified cask' do
Cask::CLI::Create.run('new-cask')
template = File.read(Cask.path('new-cask'))
template.must_equal <<-TEMPLATE.undent
class NewCask < Cask
url ''
homepage ''
version ''
sha1 ''
link :app, ''
end
TEMPLATE
end
it 'throws away additional arguments and uses the first' do
Cask::CLI::Create.run('additional-cask', 'another-cask')
Cask::CLI::Create.editor_commands.must_equal [
[Cask.path('additional-cask')]
]
end
it 'raises an exception when the cask already exists' do
lambda {
Cask::CLI::Create.run('caffeine')
}.must_raise CaskAlreadyCreatedError
end
end

View File

@ -42,11 +42,4 @@ describe Cask::CLI::Edit do
Cask::CLI::Edit.run('notacask')
}.must_raise CaskUnavailableError
end
it 'allows new casks to be created with the --create flag' do
Cask::CLI::Edit.run('brand-spankin-new', '--create')
Cask::CLI::Edit.editor_commands.must_equal [
[Cask.tapspath.join(Cask.default_tap, 'Casks', 'brand-spankin-new.rb')]
]
end
end