whisk 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,18 +1,23 @@
1
1
  Whisk
2
2
  =====
3
3
 
4
- Whisk is a simple cookbook manager for Chef, inspired by librarian.
5
- Unlike librarian, Whisk only concerns itself with fetching and preparing
6
- exactly what you tell it.
4
+ Whisk is a simple cookbook manager for Chef, inspired by librarian and
5
+ berkshelf.
7
6
 
8
- Whisk currently does not support any direct interaction with the Chef Server.
7
+ Unlike these tools, Whisk only concerns itself with fetching and preparing
8
+ exactly what you tell it, and will not resolve dependencies for you or make any
9
+ decisions about which code gets downloaded for you.
9
10
 
10
- Currently Whisk only supports fetching cookbooks directly from git,
11
- although there are plans to include support for community cookbooks in the
12
- future.
11
+ Whisk has been designed to work with git only and tries to help automating
12
+ the more tedious aspects of working in with 'the single repository per
13
+ cookbook' model.
14
+
15
+ # Configuration #
13
16
 
14
17
  Whisk will prepare one or multiple 'bowls' of cookbooks as specified in your
15
- whisk.rb file.
18
+ Whiskfile.
19
+
20
+ ## Example Whiskfile ##
16
21
 
17
22
  cb_path = "/home/msf/hack/whisk/%s"
18
23
  github = "git://github.com/cookbooks/%s.git"
@@ -20,10 +25,61 @@ whisk.rb file.
20
25
  bowl "production" do
21
26
  path cb_path % name
22
27
 
23
- ingredient "ntp",
24
- :source => github % "ntp",
25
- :options => { :ref => 'master' }
28
+ ingredient "ntp" do
29
+ source github % "ntp"
30
+ options { :ref => 'master' }
31
+ end
32
+ end
33
+
34
+ # Commands #
35
+
36
+ ## whisk prepare ##
37
+
38
+ The prepare subcommand allows you to clone your ingredients and optional
39
+ checkout a specified ref.
40
+
41
+ $ whisk prepare
42
+ Creating bowl 'production' with path /home/msf/hack/whisk/production
43
+ Preparing bowl 'production' with path /home/msf/hack/whisk/production
44
+ Cloning ingredient ntp, from git url git://github.com/cookbooks/ntp.git
45
+ Cloning into 'ntp'...
46
+ Checking out ref 'master' for ingredient ntp
47
+
48
+ You can also use specify an optional filter to run prepare on a subset of
49
+ cookbooks using ruby regexes.
50
+
51
+ # prepare the 'development' bowl
52
+ $ whisk prepare dev
53
+
54
+ # prepare the ntp cookbook in all configured bowls'
55
+ $ whisk prepare '.*' 'ntp'
56
+
57
+ # prepare a list of cookbooks
58
+ $ whisk prepare 'dev' '(ssh|ntp)'
59
+
60
+ ## whisk status ##
61
+
62
+ Whisk status calls 'git status' on the specified set of ingredients.
63
+
64
+ You can use the same filter mechanisms as described in 'whisk prepare'
65
+ to run update on a subset of ingredients
66
+
67
+ # show status for all configured bowls
68
+ $ whisk status
69
+ Status for ingredient 'production/ntp'
70
+ # On branch master
71
+ nothing to commit (working directory clean)
72
+
73
+ ## whisk update ##
74
+
75
+ Whisk update calls 'git remote update' on the specified set of ingredients
76
+ on them. It does not attempt to merge any code from your remotes.
26
77
 
27
- end
78
+ You can use the same filter mechanisms as described in 'whisk prepare'
79
+ to run update on a subset of ingredients
28
80
 
81
+ # update all ingredients, in all bowls
82
+ $ whisk update
29
83
 
84
+ # only update the 'development bowl'
85
+ $ whisk update dev
data/bin/whisk CHANGED
@@ -18,30 +18,6 @@
18
18
  #
19
19
 
20
20
  $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
21
+ require 'whisk/cli'
21
22
 
22
- require 'rubygems'
23
- require 'logger'
24
- require 'whisk/config'
25
- require 'whisk/log'
26
-
27
- # borrowed from chef/chef/lib/chef/application.rb
28
- logger = Logger.new(STDOUT)
29
- STDOUT.sync = true
30
- logger.formatter = Whisk::Log.logger.formatter
31
- Whisk::Log::Formatter.show_time = false
32
- Whisk::Log.loggers << logger
33
-
34
- if File.exists?("Whiskfile")
35
- whiskfile = "Whiskfile"
36
- else
37
- whiskfile = File.join(ENV['HOME'], '.chef', 'whisk.rb')
38
- end
39
-
40
- Whisk::Log.info "Loading configuration from Whiskfile: #{whiskfile}"
41
-
42
- Whisk::Config.from_file(whiskfile)
43
-
44
- bowls = Whisk::Config.bowls
45
- bowls.each do |name, bowl|
46
- bowl.prepare
47
- end
23
+ Whisk::CLI.start
data/lib/whisk/bowl.rb CHANGED
@@ -17,7 +17,6 @@
17
17
 
18
18
  require 'pp'
19
19
  require 'fileutils'
20
- require 'whisk/log'
21
20
  require 'whisk/ingredient'
22
21
 
23
22
  class Whisk
@@ -40,22 +39,18 @@ class Whisk
40
39
  end
41
40
  end
42
41
 
43
- def ingredient(iname, opts = {})
42
+ def ingredient(iname, &block)
44
43
  if ingredients.has_key? iname
45
- raise ArgumentError "ingredient '#{iname}' has already added to bowl '#{name}'"
44
+ raise ArgumentError "Ingredient '#{iname}' has already added to bowl '#{name}'"
46
45
  else
47
- source = opts.delete :source
48
- flavour = opts.delete :flavour
49
- options = opts.delete :options
50
- i = Whisk::Ingredient.new(iname, source, flavour, options)
51
- ingredients[iname] = i
46
+ ingredients[iname] = Whisk::Ingredient.new(iname, &block)
52
47
  end
53
48
  end
54
49
 
55
50
  def create!
56
- if not path.nil? and Dir.exists? path
51
+ unless Dir.exists? path
57
52
  begin
58
- Whisk::Log.info "creating bowl '#{name}' with path #{path}"
53
+ Whisk.ui.info "Creating bowl '#{name}' with path #{path}"
59
54
  ::FileUtils.mkdir_p path
60
55
  rescue Exception => e
61
56
  puts "#{e.backtrace} #{e.message}"
@@ -67,17 +62,33 @@ class Whisk
67
62
  self.create!
68
63
  ::Dir.chdir path
69
64
 
70
- Whisk::Log.info "preparing bowl '#{name}' with path #{path}"
65
+ Whisk.ui.info "Preparing bowl '#{name}' with path #{path}"
71
66
 
72
67
  ingredients.each do |name, ingredient|
73
68
  begin
74
69
  ingredient.prepare
75
70
  rescue Exception => e
76
- Whisk::Log.error "failed fetching ingredient #{name}! bailing"
71
+ Whisk.ui.error "Failed fetching ingredient '#{name}'"
77
72
  raise
78
73
  exit 1
79
74
  end
80
75
  end
81
76
  end
77
+
78
+ def status
79
+ ::Dir.chdir path
80
+ ingredients.each do |name, ingredient|
81
+ Whisk.ui.info "Status for ingredient '#{self.name}/#{name}'"
82
+ ingredient.status
83
+ end
84
+ end
85
+
86
+ def update
87
+ ::Dir.chdir path
88
+ ingredients.each do |name, ingredient|
89
+ Whisk.ui.info "Updating ingredient '#{self.name}/#{name}'"
90
+ ingredient.update
91
+ end
92
+ end
82
93
  end
83
94
  end
data/lib/whisk/cli.rb ADDED
@@ -0,0 +1,96 @@
1
+ # Author:: Jamie Winsor <jamie@vialstudios.com>
2
+ # Copyright:: Copyright (c) 2012 Jamie Winsor
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+ # this file is derived f
18
+
19
+ require 'thor'
20
+ require 'whisk'
21
+ require 'whisk/whiskfile'
22
+
23
+ def filter_bowls(bowls, bowl=nil, ingredient=nil)
24
+ if bowl
25
+ bowls.delete_if {|k,v| !k.to_s.match(/^#{bowl}$/)}
26
+ if ingredient
27
+ bowls.each do |name, b|
28
+ bowls[name].ingredients.delete_if {|k,v| !k.to_s.match(/^#{ingredient}$/)}
29
+ end
30
+ end
31
+ end
32
+
33
+ return bowls
34
+ end
35
+
36
+ class Whisk
37
+ class CLI < Thor
38
+ def initialize(*)
39
+ super
40
+ # JW TODO: Replace Chef::Knife::UI with our own UI class
41
+ ::Whisk.ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
42
+ @options = options.dup # unfreeze frozen options Hash from Thor
43
+ rescue Error => e
44
+ Whisk.ui.fatal e
45
+ exit e.status_code
46
+ end
47
+
48
+ namespace "whisk"
49
+
50
+ method_option :whiskfile,
51
+ type: :string,
52
+ default: File.join(Dir.pwd, Whisk::DEFAULT_FILENAME),
53
+ desc: "Path to a Whiskfile to operate off of.",
54
+ aliases: "-w",
55
+ banner: "PATH"
56
+ desc "prepare", "prepare a bowl by cloning any missing repositories"
57
+ def prepare(bowl=nil, ingredient=nil)
58
+ whiskfile = ::Whisk::WhiskFile.from_file(options[:whiskfile])
59
+ bowls = filter_bowls(whiskfile.bowls, bowl, ingredient)
60
+
61
+ bowls.each do |name, bowl|
62
+ bowl.prepare
63
+ end
64
+ end
65
+
66
+ method_option :whiskfile,
67
+ type: :string,
68
+ default: File.join(Dir.pwd, Whisk::DEFAULT_FILENAME),
69
+ desc: "Path to a Whiskfile to operate off of.",
70
+ aliases: "-w",
71
+ banner: "PATH"
72
+ desc "prepare", "prepare a bowl by cloning any missing repositories"
73
+ def status(bowl=nil, ingredient=nil)
74
+ whiskfile = ::Whisk::WhiskFile.from_file(options[:whiskfile])
75
+ bowls = filter_bowls(whiskfile.bowls, bowl, ingredient)
76
+ bowls.each do |name, bowl|
77
+ bowl.status
78
+ end
79
+ end
80
+
81
+ method_option :whiskfile,
82
+ type: :string,
83
+ default: File.join(Dir.pwd, Whisk::DEFAULT_FILENAME),
84
+ desc: "Path to a Whiskfile to operate off of.",
85
+ aliases: "-w",
86
+ banner: "PATH"
87
+ desc "prepare", "prepare a bowl by cloning any missing repositories"
88
+ def update(bowl=nil, ingredient=nil)
89
+ whiskfile = ::Whisk::WhiskFile.from_file(options[:whiskfile])
90
+ bowls = filter_bowls(whiskfile.bowls, bowl, ingredient)
91
+ bowls.each do |name, bowl|
92
+ bowl.update
93
+ end
94
+ end
95
+ end
96
+ end
@@ -16,7 +16,6 @@
16
16
  # limitations under the License.
17
17
 
18
18
  require 'whisk/mixin/shellout'
19
- require 'whisk/log'
20
19
  require 'whisk/ingredient'
21
20
 
22
21
  class Whisk
@@ -26,41 +25,38 @@ class Whisk
26
25
  include Whisk::Mixin::ShellOut
27
26
 
28
27
  def clone
29
- unless ::File.exists? File.join(Dir.pwd, name, ".git", "config")
30
- Whisk::Log.info "cloning ingredient #{self.name}, " + "from git url #{self.source}"
28
+ if ::File.exists? File.join(Dir.pwd, name, ".git", "config")
29
+ Whisk.ui.info "Ingredient #{self.name} already prepared, moving on"
30
+ else
31
+ Whisk.ui.info "Cloning ingredient #{self.name}, " + "from git url #{self.source}"
31
32
  shell_out("git clone #{self.source} #{self.name}")
32
33
  end
33
34
  end
34
35
 
35
36
  def checkout(ref="master")
36
- Whisk::Log.info "checking out ref '#{ref}' for ingredient #{self.name}"
37
+ if self.options and self.options.has_key? :ref
38
+ Whisk.ui.info "Checking out ref '#{ref}' for ingredient #{self.name}"
37
39
  shell_out("git checkout #{ref}", :cwd => self.name)
38
- end
39
-
40
- def post_fetch
41
- end
42
- def pre_fetch
43
- end
44
-
45
- def fetch
46
- Whisk::Log.info "fetching ingredient '#{self.name}', from git url #{self.source}"
47
- shell_out("git fetch --all")
40
+ end
48
41
  end
49
42
 
50
43
  def prepare
51
44
  begin
52
45
  self.clone
53
- self.fetch
54
- if self.options and self.options.has_key? :ref
55
- self.checkout self.options[:ref]
56
- else
57
- self.checkout
58
- end
46
+ self.checkout
59
47
  rescue Exception => e
60
- Whisk::Log.error "#{e.message} #{e.backtrace}"
48
+ Whisk.ui.error "#{e.message} #{e.backtrace}"
61
49
  raise
62
50
  end
63
51
  end
52
+
53
+ def status
54
+ shell_out("git status", :cwd => self.name)
55
+ end
56
+
57
+ def update
58
+ shell_out("git remote update", :cwd => self.name)
59
+ end
64
60
  end
65
61
  end
66
62
  end
@@ -15,24 +15,37 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
 
18
+ require 'chef/mixin/params_validate'
18
19
  require 'whisk/flavours'
19
20
 
20
21
  class Whisk
21
22
  class Ingredient
22
23
 
23
- attr_accessor :name, :source, :flavour, :options
24
+ include Chef::Mixin::ParamsValidate
24
25
 
25
- def initialize(name, source=nil, flavour='git', options={})
26
+ attr_reader :name
27
+
28
+ def initialize(name, &block)
26
29
  @name = name
27
- @source = source
28
- @flavour = flavour || 'git'
29
- @options = options
30
+ @flavour = 'git'
31
+ @source = nil
32
+ @options = {}
30
33
 
31
- if source.nil?
32
- raise ArgumentError, "must provide source for Ingredient #{name}"
33
- end
34
+ instance_eval(&block) if block_given?
34
35
 
35
36
  self.class.send(:include, Whisk::FLAVOURS[@flavour])
36
37
  end
38
+
39
+ def source(arg=nil)
40
+ set_or_return(:source, arg, :required => true)
41
+ end
42
+
43
+ def flavour(arg=nil)
44
+ set_or_return(:flavour, arg, :default => 'git')
45
+ end
46
+
47
+ def options(arg=nil)
48
+ set_or_return(:options, arg, :default => {})
49
+ end
37
50
  end
38
51
  end
data/lib/whisk/version.rb CHANGED
@@ -17,5 +17,5 @@
17
17
  #
18
18
 
19
19
  class Whisk
20
- VERSION = '0.0.4'
20
+ VERSION = '0.1.0'
21
21
  end
@@ -1,4 +1,5 @@
1
1
  #
2
+ #
2
3
  # Author:: Adam Jacob (<adam@opscode.com>)
3
4
  # Author:: Mathieu Sauve-Frankel <msf@kisoku.net>
4
5
  # Copyright:: Copyright (c) 2008 Opscode, Inc.
@@ -18,38 +19,41 @@
18
19
  # limitations under the License.
19
20
  #
20
21
  # from_file is derived from chef/chef/lib/chef/mixin/from_file.rb
22
+ #
23
+ #
21
24
 
22
- require 'whisk/bowl'
25
+ require 'whisk'
23
26
 
24
27
  class Whisk
25
- class Config
26
- attr_accessor :bowls
27
-
28
+ class WhiskFile
28
29
  @@bowls = {}
29
30
 
30
- def self.add_bowl(bowl)
31
- @@bowls[bowl.name] = bowl
32
- end
33
-
34
- def self.bowls
35
- @@bowls
36
- end
31
+ class << self
32
+ def add_bowl(bowl)
33
+ if @@bowls.has_key? name
34
+ raise ArgumentError "bowl #{name} already exists"
35
+ else
36
+ @@bowls[bowl.name] = bowl
37
+ end
38
+ end
37
39
 
38
- def self.bowl(name, &block)
39
- if self.bowls.has_key? name
40
- raise ArgumentError "bowl #{name} already exists"
41
- else
40
+ def bowl(name, &block)
42
41
  b = Whisk::Bowl.new(name)
43
42
  b.instance_eval(&block)
44
- self.add_bowl(b)
43
+ add_bowl(b)
44
+ end
45
+
46
+ def bowls
47
+ @@bowls
45
48
  end
46
- end
47
49
 
48
- def self.from_file(filename)
49
- if ::File.exists?(filename) && ::File.readable?(filename)
50
- self.instance_eval(::IO.read(filename), filename, 1)
51
- else
52
- raise IOError, "Cannot open or read #{filename}!"
50
+ def from_file(filename)
51
+ if ::File.exists?(filename) && ::File.readable?(filename)
52
+ instance_eval(::IO.read(filename), filename, 1)
53
+ self
54
+ else
55
+ raise IOError, "Cannot open or read #{filename}!"
56
+ end
53
57
  end
54
58
  end
55
59
  end
data/lib/whisk.rb CHANGED
@@ -16,4 +16,14 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ require 'chef/knife'
19
20
  require 'whisk/version'
21
+ require 'whisk/bowl'
22
+
23
+ class Whisk
24
+ DEFAULT_FILENAME = 'Whiskfile'
25
+
26
+ class << self
27
+ attr_accessor :ui
28
+ end
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whisk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-07 00:00:00.000000000 Z
12
+ date: 2012-08-17 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chef
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: mixlib-log
16
- requirement: &7955580 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
17
33
  none: false
18
34
  requirements:
19
35
  - - ! '>='
@@ -21,10 +37,15 @@ dependencies:
21
37
  version: 1.3.0
22
38
  type: :runtime
23
39
  prerelease: false
24
- version_requirements: *7955580
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.3.0
25
46
  - !ruby/object:Gem::Dependency
26
47
  name: mixlib-shellout
27
- requirement: &7954280 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
28
49
  none: false
29
50
  requirements:
30
51
  - - ! '>='
@@ -32,10 +53,31 @@ dependencies:
32
53
  version: 1.0.0
33
54
  type: :runtime
34
55
  prerelease: false
35
- version_requirements: *7954280
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: thor
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
36
78
  - !ruby/object:Gem::Dependency
37
79
  name: rspec
38
- requirement: &7951860 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
39
81
  none: false
40
82
  requirements:
41
83
  - - ! '>='
@@ -43,7 +85,12 @@ dependencies:
43
85
  version: '0'
44
86
  type: :development
45
87
  prerelease: false
46
- version_requirements: *7951860
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
47
94
  description: A simple Chef cookbook dependency manager
48
95
  email: msf@kisoku.net
49
96
  executables:
@@ -53,15 +100,15 @@ extra_rdoc_files: []
53
100
  files:
54
101
  - LICENSE
55
102
  - README.md
103
+ - lib/whisk.rb
104
+ - lib/whisk/mixin/shellout.rb
105
+ - lib/whisk/cli.rb
106
+ - lib/whisk/flavours.rb
107
+ - lib/whisk/whiskfile.rb
108
+ - lib/whisk/ingredient.rb
56
109
  - lib/whisk/version.rb
57
110
  - lib/whisk/bowl.rb
58
- - lib/whisk/ingredient.rb
59
- - lib/whisk/mixin/shellout.rb
60
111
  - lib/whisk/flavour/git.rb
61
- - lib/whisk/flavours.rb
62
- - lib/whisk/config.rb
63
- - lib/whisk/log.rb
64
- - lib/whisk.rb
65
112
  - bin/whisk
66
113
  homepage: http://github.com/kisoku/whisk
67
114
  licenses: []
@@ -83,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
130
  version: '0'
84
131
  requirements: []
85
132
  rubyforge_project:
86
- rubygems_version: 1.8.15
133
+ rubygems_version: 1.8.24
87
134
  signing_key:
88
135
  specification_version: 3
89
136
  summary: A simple Chef cookbook dependency manager
data/lib/whisk/log.rb DELETED
@@ -1,37 +0,0 @@
1
- #
2
- # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Author:: AJ Christensen (<@aj@opscode.com>)
4
- # Author:: Christopher Brown (<cb@opscode.com>)
5
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
6
- # License:: Apache License, Version 2.0
7
- #
8
- # Licensed under the Apache License, Version 2.0 (the "License");
9
- # you may not use this file except in compliance with the License.
10
- # You may obtain a copy of the License at
11
- #
12
- # http://www.apache.org/licenses/LICENSE-2.0
13
- #
14
- # Unless required by applicable law or agreed to in writing, software
15
- # distributed under the License is distributed on an "AS IS" BASIS,
16
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- # See the License for the specific language governing permissions and
18
- # limitations under the License.
19
- #
20
- # this file is derived from chef/chef/lib/chef/log.rb
21
-
22
- require 'logger'
23
- require 'mixlib/log'
24
-
25
- class Whisk
26
- class Log
27
- extend Mixlib::Log
28
-
29
- init
30
-
31
- class Formatter
32
- def self.show_time=(*args)
33
- Mixlib::Log::Formatter.show_time = *args
34
- end
35
- end
36
- end
37
- end