whisk 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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