batali 0.4.10 → 0.5.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.
@@ -1,6 +1,6 @@
1
- require 'batali'
2
- require 'fileutils'
3
- require 'tmpdir'
1
+ require "batali"
2
+ require "fileutils"
3
+ require "tmpdir"
4
4
 
5
5
  module Batali
6
6
  # Source of asset
@@ -9,40 +9,44 @@ module Batali
9
9
  class Path < Source
10
10
 
11
11
  # @return [Array<String>] default ignore globs
12
- DEFAULT_IGNORE = ['.git*']
12
+ DEFAULT_IGNORE = [".git*"]
13
13
  # @return [Array<String>] valid ignore file names
14
- IGNORE_FILE = ['chefignore', '.chefignore']
14
+ IGNORE_FILE = ["chefignore", ".chefignore"]
15
15
 
16
16
  include Bogo::Memoization
17
17
 
18
18
  attribute :path, String, :required => true, :equivalent => true
19
19
 
20
+ def initialize(*_, &block)
21
+ super
22
+ self.path = Utility.clean_path(path)
23
+ end
24
+
20
25
  # @return [String] directory containing contents
21
26
  def asset
22
27
  memoize(:asset) do
23
28
  dir = Dir.mktmpdir
24
29
  chefignore = IGNORE_FILE.map do |c_name|
25
- c_path = File.join(path, c_name)
30
+ c_path = Utility.join_path(path, c_name)
26
31
  c_path if File.exist?(c_path)
27
32
  end.compact.first
28
33
  chefignore = chefignore ? File.readlines(chefignore) : []
29
34
  chefignore += DEFAULT_IGNORE
30
35
  chefignore.uniq!
31
- files_to_copy = Dir.glob(File.join(path, '{.[^.]*,**}', '**', '{*,*.*,.*}'))
36
+ files_to_copy = Dir.glob(File.join(path, "{.[^.]*,**}", "**", "{*,*.*,.*}"))
32
37
  files_to_copy = files_to_copy.map do |file_path|
33
38
  next unless File.file?(file_path)
34
- relative_path = file_path.sub("#{path}#{File::SEPARATOR}", '')
35
- relative_path unless chefignore.detect{|ig| File.fnmatch(ig, relative_path)}
39
+ relative_path = file_path.sub("#{path}#{File::SEPARATOR}", "")
40
+ relative_path unless chefignore.detect { |ig| File.fnmatch(ig, relative_path) }
36
41
  end.compact
37
42
  files_to_copy.each do |relative_path|
38
- new_path = File.join(dir, relative_path)
43
+ new_path = Utility.join_path(dir, relative_path)
39
44
  FileUtils.mkdir_p(File.dirname(new_path))
40
- FileUtils.cp(File.join(path, relative_path), new_path)
45
+ FileUtils.cp(Utility.join_path(path, relative_path), new_path)
41
46
  end
42
47
  dir
43
48
  end
44
49
  end
45
-
46
50
  end
47
51
  end
48
52
  end
@@ -1,14 +1,13 @@
1
- require 'batali'
2
- require 'http'
3
- require 'tmpdir'
4
- require 'rubygems/package'
5
- require 'zlib'
1
+ require "batali"
2
+ require "http"
3
+ require "tmpdir"
4
+ require "rubygems/package"
5
+ require "zlib"
6
6
 
7
7
  module Batali
8
8
  class Source
9
9
  # Site based source
10
10
  class Site < Source
11
-
12
11
  include Bogo::Memoization
13
12
 
14
13
  # @return [Array<Hash>] dependency strings
@@ -25,7 +24,7 @@ module Batali
25
24
  #
26
25
  # @param args [Hash]
27
26
  # @return [self]
28
- def initialize(args={})
27
+ def initialize(args = {})
29
28
  @deps = args.delete(:dependencies) || {}
30
29
  super
31
30
  end
@@ -43,30 +42,30 @@ module Batali
43
42
  # @return [String] path to cache
44
43
  def cache_directory
45
44
  memoize(:cache_directory) do
46
- @cache ||= File.join(cache_path, 'remote_site')
45
+ @cache ||= Utility.join_path(cache_path, "remote_site")
47
46
  cache
48
47
  end
49
48
  end
50
49
 
51
50
  # @return [String] directory
52
51
  def asset
53
- path = File.join(cache_directory, Base64.urlsafe_encode64(url))
54
- if(File.directory?(path))
55
- discovered_path = Dir.glob(File.join(path, '*')).reject do |i|
52
+ path = Utility.join_path(cache_directory, Base64.urlsafe_encode64(url))
53
+ if File.directory?(path)
54
+ discovered_path = Dir.glob(Utility.join_path(path, "*")).reject do |i|
56
55
  i.end_with?("#{File::SEPARATOR}asset")
57
56
  end.first
58
57
  FileUtils.rm_rf(path)
59
58
  end
60
- unless(discovered_path)
59
+ unless discovered_path
61
60
  retried = false
62
61
  begin
63
62
  FileUtils.mkdir_p(path)
64
- result = HTTP.get(url)
65
- while(result.code == 302)
66
- result = HTTP.get(result.headers['Location'])
63
+ result = HTTP.get(url.end_with?("/") ? url : url + "/")
64
+ while result.code == 302
65
+ result = HTTP.get(result.headers["Location"])
67
66
  end
68
- File.open(a_path = File.join(path, 'asset'), 'wb') do |file|
69
- while(content = result.body.readpartial(2048))
67
+ File.open(a_path = Utility.join_path(path, "asset"), "wb") do |file|
68
+ while content = result.body.readpartial(2048)
70
69
  file.write content
71
70
  end
72
71
  end
@@ -76,10 +75,10 @@ module Batali
76
75
  ext.rewind
77
76
  ext.each do |entry|
78
77
  next unless entry.file?
79
- n_path = File.join(path, entry.full_name)
78
+ n_path = Utility.join_path(path, entry.full_name)
80
79
  FileUtils.mkdir_p(File.dirname(n_path))
81
- File.open(n_path, 'wb') do |file|
82
- while(content = entry.read(2048))
80
+ File.open(n_path, "wb") do |file|
81
+ while content = entry.read(2048)
83
82
  file.write(content)
84
83
  end
85
84
  end
@@ -91,18 +90,18 @@ module Batali
91
90
  end
92
91
  rescue => e
93
92
  FileUtils.rm_rf(path)
94
- unless(retried)
93
+ unless retried
95
94
  FileUtils.mkdir_p(path)
96
95
  retried = true
97
96
  retry
98
97
  end
99
98
  raise
100
99
  end
101
- discovered_path = Dir.glob(File.join(path, '*')).reject do |i|
100
+ discovered_path = Dir.glob(Utility.join_path(path, "*")).reject do |i|
102
101
  i.end_with?("#{File::SEPARATOR}asset")
103
102
  end.first
104
103
  end
105
- unless(discovered_path)
104
+ unless discovered_path
106
105
  raise Errno::ENOENT.new "Failed to locate asset within `#{path}`"
107
106
  end
108
107
  discovered_path
@@ -110,13 +109,12 @@ module Batali
110
109
 
111
110
  # @return [TrueClass, FalseClass]
112
111
  def clean_asset(asset_path)
113
- if(asset_path)
112
+ if asset_path
114
113
  super File.dirname(asset_path)
115
114
  else
116
115
  false
117
116
  end
118
117
  end
119
-
120
118
  end
121
119
  end
122
120
  end
@@ -1,4 +1,4 @@
1
- require 'batali'
1
+ require "batali"
2
2
 
3
3
  # Batali namespace
4
4
  module Batali
@@ -7,9 +7,8 @@ module Batali
7
7
  TAG_LINES = [
8
8
  'I got 99 problems but a policyfile ain\'t one',
9
9
  'Solve the way you want, not the way you\'re told',
10
- 'Build environments, not applications',
11
- 'DRY should be the rule, not the exception',
12
- 'Solve for the forest, not just a tree'
10
+ "Build environments, not applications",
11
+ "DRY should be the rule, not the exception",
12
+ "Solve for the forest, not just a tree",
13
13
  ]
14
-
15
14
  end
@@ -1,23 +1,21 @@
1
- require 'batali'
1
+ require "batali"
2
2
 
3
3
  # Batali namespace
4
4
  module Batali
5
5
  # Customized Unit
6
6
  class Unit < Grimoire::Unit
7
- attribute :source, Source, :coerce => lambda{|v| Batali::Source.build(v)}
7
+ attribute :source, Source, :coerce => lambda { |v| Batali::Source.build(v) }
8
8
  attribute(:dependencies, [Batali::UnitDependency, Grimoire::DEPENDENCY_CLASS],
9
- :multiple => true,
10
- :default => [],
11
- :coerce => lambda{ |val|
12
- Batali::UnitDependency.new(val.first, *val.last)
13
- }
14
- )
9
+ :multiple => true,
10
+ :default => [],
11
+ :coerce => lambda { |val|
12
+ Batali::UnitDependency.new(val.first, *val.last)
13
+ })
15
14
  attribute(:version, [Batali::UnitVersion, Grimoire::VERSION_CLASS],
16
- :required => true,
17
- :coerce => lambda{ |val|
18
- Batali::UnitVersion.new(val)
19
- }
20
- )
15
+ :required => true,
16
+ :coerce => lambda { |val|
17
+ Batali::UnitVersion.new(val)
18
+ })
21
19
 
22
20
  # @return [TrueClass, FalseClass]
23
21
  def diff?(u)
@@ -33,15 +31,14 @@ module Batali
33
31
  def diff(u)
34
32
  Smash.new.tap do |_diff|
35
33
  [:name, :version].each do |k|
36
- unless(send(k) == u.send(k))
34
+ unless send(k) == u.send(k)
37
35
  _diff[k] = [send(k), u.send(k)]
38
36
  end
39
37
  end
40
- if(source)
38
+ if source
41
39
  _diff.merge!(source.diff(u.source))
42
40
  end
43
41
  end
44
42
  end
45
-
46
43
  end
47
44
  end
@@ -1,11 +1,10 @@
1
- require 'batali'
1
+ require "batali"
2
2
 
3
3
  # Batali namespace
4
4
  module Batali
5
5
 
6
6
  # Load cookbook units
7
7
  class UnitLoader < Utility
8
-
9
8
  include Bogo::Memoization
10
9
 
11
10
  attribute :file, BFile, :required => true
@@ -20,7 +19,7 @@ module Batali
20
19
  memoize(:populate) do
21
20
  (file.source + file.chef_server).each do |src|
22
21
  src.units.find_all do |unit|
23
- if(restrictions[unit.name])
22
+ if restrictions[unit.name]
24
23
  restrictions[unit.name] == src.identifier
25
24
  else
26
25
  true
@@ -30,22 +29,22 @@ module Batali
30
29
  end
31
30
  end
32
31
  file.cookbook.each do |ckbk|
33
- if(ckbk.git)
32
+ if ckbk.git
34
33
  source = Origin::Git.new(
35
34
  :name => ckbk.name,
36
35
  :url => ckbk.git,
37
36
  :subdirectory => ckbk.path,
38
- :ref => ckbk.ref || 'master',
39
- :cache_path => cache
37
+ :ref => ckbk.ref || "master",
38
+ :cache_path => cache,
40
39
  )
41
- elsif(ckbk.path)
40
+ elsif ckbk.path
42
41
  source = Origin::Path.new(
43
42
  :name => ckbk.name,
44
43
  :path => ckbk.path,
45
- :cache_path => cache
44
+ :cache_path => cache,
46
45
  )
47
46
  end
48
- if(source)
47
+ if source
49
48
  system.add_unit(source.units.first)
50
49
  end
51
50
  end
@@ -57,13 +56,13 @@ module Batali
57
56
  memoize(:restrictions) do
58
57
  rest = (file.restrict || Smash.new).to_smash
59
58
  file.cookbook.each do |ckbk|
60
- if(auto_path_restrict || ckbk.restrict)
61
- if(ckbk.path)
59
+ if auto_path_restrict || ckbk.restrict
60
+ if ckbk.path
62
61
  rest[ckbk.name] = Smash.new(:path => ckbk.path).checksum
63
- elsif(ckbk.git)
62
+ elsif ckbk.git
64
63
  rest[ckbk.name] = Smash.new(
65
64
  :url => ckbk.git,
66
- :ref => ckbk.ref
65
+ :ref => ckbk.ref,
67
66
  ).checksum
68
67
  end
69
68
  end
@@ -71,7 +70,5 @@ module Batali
71
70
  rest
72
71
  end
73
72
  end
74
-
75
73
  end
76
-
77
74
  end
@@ -1,8 +1,33 @@
1
- require 'batali'
1
+ require "batali"
2
2
 
3
3
  module Batali
4
+ # Utility class to provide helper methods
4
5
  class Utility < Grimoire::Utility
5
6
 
7
+ # Prefix for building UNC paths on Windows
8
+ UNC_PREFIX = "//?/".freeze
9
+
10
+ # Properly format and expand path based
11
+ # on platform in use
12
+ def self.clean_path(path)
13
+ path = File.expand_path(path.to_s)
14
+ if RUBY_PLATFORM =~ /mswin|mingw|windows/ &&
15
+ path.downcase.match(/^[a-z]:/) &&
16
+ ENV["BATALI_DISABLE_UNC"].nil?
17
+ path = UNC_PREFIX + path
18
+ end
19
+ path
20
+ end
21
+
22
+ # Join arguments to base path and clean
23
+ #
24
+ # @param base [String] base path
25
+ # @param args [Array<String>]
26
+ # @return [String]
27
+ def self.join_path(base, *args)
28
+ clean_path(File.join(base, *args))
29
+ end
30
+
6
31
  # Helper module for enabling chef server support
7
32
  module Chef
8
33
 
@@ -19,28 +44,33 @@ module Batali
19
44
 
20
45
  # Load and configure chef
21
46
  def init_chef!
22
- debug 'Loading chef into the runtime'
47
+ debug "Loading chef into the runtime"
23
48
  begin
24
- require 'chef'
25
- require 'chef/rest'
26
- debug 'Successfully loaded chef into the runtime'
49
+ require "chef"
50
+ begin
51
+ require "chef/rest"
52
+ @_api_klass = ::Chef::REST
53
+ rescue LoadError
54
+ # Newer versions of chef do not include REST
55
+ require "chef/server_api"
56
+ @_api_klass = ::Chef::ServerAPI
57
+ end
58
+ debug "Successfully loaded chef into the runtime"
27
59
  rescue LoadError => e
28
60
  debug "Failed to load the chef gem: #{e.class}: #{e}"
29
- raise 'The `chef` gem was not found. Please `gem install chef` or add `chef` to your bundle.'
61
+ raise "The `chef` gem was not found. Please `gem install chef` or add `chef` to your bundle."
30
62
  end
31
63
  Smash.new(
32
64
  :endpoint => :chef_server_url,
33
65
  :c_name => :node_name,
34
- :c_key => :client_key
66
+ :c_key => :client_key,
35
67
  ).each do |local_attr, config_key|
36
- unless(self.send(local_attr)) # rubocop:disable Style/RedundantSelf
68
+ unless self.send(local_attr)
37
69
  memoize(:knife_configure, :global) do
38
- require 'chef/knife'
70
+ require "chef/knife"
39
71
  ::Chef::Knife.new.configure_chef
40
72
  end
41
- # rubocop:disable Style/RedundantSelf
42
73
  debug "Settting #{config_key} from knife configuration file for #{self.class} <#{endpoint}>"
43
- # rubocop:disable Style/RedundantSelf
44
74
  self.send("#{local_attr}=", ::Chef::Config[config_key])
45
75
  end
46
76
  end
@@ -54,15 +84,13 @@ module Batali
54
84
  # @return [Object] result
55
85
  def api_service
56
86
  memoize(:api_service) do
57
- ::Chef::REST.new(
87
+ @_api_klass.new(
58
88
  endpoint,
59
89
  c_name,
60
90
  c_key
61
91
  )
62
92
  end
63
93
  end
64
-
65
94
  end
66
-
67
95
  end
68
96
  end
@@ -1,5 +1,5 @@
1
1
  # Batali namespace
2
2
  module Batali
3
3
  # Current version
4
- VERSION = Gem::Version.new('0.4.10')
4
+ VERSION = Gem::Version.new("0.5.0")
5
5
  end
@@ -1,92 +1,87 @@
1
- require 'batali'
1
+ require "batali"
2
2
 
3
3
  class Chef
4
4
  class Knife
5
5
  # Batali manifest to chef server sync
6
6
  class BataliSync < Knife
7
-
8
- banner 'knife batali sync'
7
+ banner "knife batali sync"
9
8
 
10
9
  option(:blacklist,
11
- :short => '-B COOKBOOK_NAME[,COOKBOOK_NAME]',
12
- :long => '--blacklist COOKBOOK_NAME[,COOKBOOK_NAME]',
13
- :description => 'Cookbooks to ignore from sync',
14
- :proc => lambda{|val|
15
- Chef::Config[:knife][:batali_blacklist] ||= []
16
- Chef::Config[:knife][:batali_blacklist] += val.split(',')
17
- }
18
- )
10
+ :short => "-B COOKBOOK_NAME[,COOKBOOK_NAME]",
11
+ :long => "--blacklist COOKBOOK_NAME[,COOKBOOK_NAME]",
12
+ :description => "Cookbooks to ignore from sync",
13
+ :proc => lambda { |val|
14
+ Chef::Config[:knife][:batali_blacklist] ||= []
15
+ Chef::Config[:knife][:batali_blacklist] += val.split(",")
16
+ })
19
17
 
20
18
  option(:details,
21
- :long => '--[no-]details',
22
- :boolean => true,
23
- :default => true,
24
- :description => 'Show details of cookbooks to be removed / added'
25
- )
19
+ :long => "--[no-]details",
20
+ :boolean => true,
21
+ :default => true,
22
+ :description => "Show details of cookbooks to be removed / added")
26
23
 
27
24
  option(:show_remaining,
28
- :long => '--[no-]show-remaining',
29
- :description => 'Display cookbook details of expected final server state',
30
- :boolean => true,
31
- :default => false,
32
- :proc => lambda{|val|
33
- Chef::Config[:knife][:batali_show_remaining] = val
34
- }
35
- )
25
+ :long => "--[no-]show-remaining",
26
+ :description => "Display cookbook details of expected final server state",
27
+ :boolean => true,
28
+ :default => false,
29
+ :proc => lambda { |val|
30
+ Chef::Config[:knife][:batali_show_remaining] = val
31
+ })
36
32
 
37
33
  option(:dry_run,
38
- :long => '--[no-]dry-run',
39
- :description => 'Display information but perform no action',
40
- :boolean => true,
41
- :default => false
42
- )
34
+ :long => "--[no-]dry-run",
35
+ :description => "Display information but perform no action",
36
+ :boolean => true,
37
+ :default => false)
43
38
 
44
39
  def run
45
40
  Chef::Config[:knife][:batali_blacklist] ||= []
46
41
  config[:verbose] = config[:verbosity].to_i > 0
47
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Chef Server Batali Manifest Sync"
48
- valid_cookbooks = run_task('Generating valid cookbook versions from manifest') do
42
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Chef Server Batali Manifest Sync"
43
+ valid_cookbooks = run_task("Generating valid cookbook versions from manifest") do
49
44
  generate_manifest_cookbooks
50
45
  end
51
- remote_cookbooks = run_task('Generating remote cookbook versions from chef server') do
46
+ remote_cookbooks = run_task("Generating remote cookbook versions from chef server") do
52
47
  generate_remote_cookbooks
53
48
  end
54
- to_remove = run_task('Building cookbook removal list') do
49
+ to_remove = run_task("Building cookbook removal list") do
55
50
  locate_removals(
56
51
  :manifest => valid_cookbooks,
57
- :server => remote_cookbooks
52
+ :server => remote_cookbooks,
58
53
  )
59
54
  end
60
- to_add = run_task('Building cookbook upload list') do
55
+ to_add = run_task("Building cookbook upload list") do
61
56
  locate_additions(
62
57
  :manifest => valid_cookbooks,
63
- :server => remote_cookbooks
58
+ :server => remote_cookbooks,
64
59
  )
65
60
  end
66
- if(to_add.empty? && to_remove.empty?)
67
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Chef Server Batali Manifest Sync - #{ui.color('No Changes Detected!', :green, :bold)}" # rubocop:disable Metrics/LineLength
61
+ if to_add.empty? && to_remove.empty?
62
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Chef Server Batali Manifest Sync - #{ui.color("No Changes Detected!", :green, :bold)}" # rubocop:disable Metrics/LineLength
68
63
  else
69
64
  display_sync_info(
70
65
  :additions => to_add,
71
66
  :removals => to_remove,
72
- :manifest => valid_cookbooks
67
+ :manifest => valid_cookbooks,
73
68
  )
74
- unless(config[:dry_run])
75
- ui.confirm 'Sync remote cookbooks with Batali manifest'
69
+ unless config[:dry_run]
70
+ ui.confirm "Sync remote cookbooks with Batali manifest"
76
71
  remove_cookbooks(to_remove) unless to_remove.empty?
77
72
  add_cookbooks(to_add) unless to_add.empty?
78
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Chef Server Batali Manifest Sync - #{ui.color('Sync Complete!', :green, :bold)}" # rubocop:disable Metrics/LineLength
73
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Chef Server Batali Manifest Sync - #{ui.color("Sync Complete!", :green, :bold)}" # rubocop:disable Metrics/LineLength
79
74
  else
80
- ui.warn 'Dry run requested. No action taken.'
75
+ ui.warn "Dry run requested. No action taken."
81
76
  end
82
77
  end
83
78
  end
84
79
 
85
80
  def remove_cookbooks(ckbks)
86
- run_task('Removing cookbooks') do
81
+ run_task("Removing cookbooks") do
87
82
  ckbks.each do |c_name, vers|
88
83
  vers.each do |version|
89
- if(config[:verbose])
84
+ if config[:verbose]
90
85
  ui.warn "Deleting cookbook #{c_name} @ #{version}"
91
86
  end
92
87
  rest.delete("/cookbooks/#{c_name}/#{version}")
@@ -97,13 +92,13 @@ class Chef
97
92
 
98
93
  def add_cookbooks(ckbks)
99
94
  Batali::Command::Install.new({}, []).execute!
100
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Adding cookbooks to Chef server."
95
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Adding cookbooks to Chef server."
101
96
  Knife::Upload.load_deps
102
97
  ckbks.each do |c_name, vers|
103
98
  vers.each do |version|
104
99
  c_path = [
105
- File.join('cookbooks', c_name),
106
- File.join('cookbooks', "#{c_name}-#{version}")
100
+ File.join("cookbooks", c_name),
101
+ File.join("cookbooks", "#{c_name}-#{version}"),
107
102
  ].detect do |_path|
108
103
  File.directory?(_path)
109
104
  end
@@ -111,44 +106,44 @@ class Chef
111
106
  uploader.configure_chef
112
107
  uploader.config = config
113
108
  uploader.name_args = [c_path]
114
- if(config[:verbose])
109
+ if config[:verbose]
115
110
  ui.warn "Unloading cookbook #{c_name} @ #{version} - `#{c_path}`"
116
111
  end
117
112
  uploader.run
118
113
  end
119
114
  end
120
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Chef server cookbook additions complete."
115
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Chef server cookbook additions complete."
121
116
  end
122
117
 
123
118
  def display_sync_info(opts)
124
119
  num_remove = ui.color(opts[:removals].size.to_s, :red, :bold)
125
120
  num_add = ui.color(opts[:additions].size.to_s, :green, :bold)
126
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Removals - #{num_remove} Additions: #{num_add}"
127
- if(config[:details])
128
- unless(opts[:removals].empty?)
129
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Cookbooks to be #{ui.color('removed', :red, :bold)}:"
121
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Removals - #{num_remove} Additions: #{num_add}"
122
+ if config[:details]
123
+ unless opts[:removals].empty?
124
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Cookbooks to be #{ui.color("removed", :red, :bold)}:"
130
125
  opts[:removals].sort.each do |name, versions|
131
126
  vers = versions.map do |v|
132
127
  Gem::Version.new(v)
133
- end.sort.map(&:to_s).join(', ')
128
+ end.sort.map(&:to_s).join(", ")
134
129
  ui.info " #{ui.color(name, :red, :bold)}: #{ui.color(vers, :red)}"
135
130
  end
136
131
  end
137
- unless(opts[:additions].empty?)
138
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Cookbooks to be #{ui.color('added', :green, :bold)}:"
132
+ unless opts[:additions].empty?
133
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Cookbooks to be #{ui.color("added", :green, :bold)}:"
139
134
  opts[:additions].sort.each do |name, versions|
140
135
  vers = versions.map do |v|
141
136
  Gem::Version.new(v)
142
- end.sort.map(&:to_s).join(', ')
137
+ end.sort.map(&:to_s).join(", ")
143
138
  ui.info " #{ui.color(name, :green, :bold)}: #{ui.color(vers, :green)}"
144
139
  end
145
140
  end
146
- if(Chef::Config[:knife][:batali_show_remaining])
147
- ui.info "#{ui.color('[Batali]', :green, :bold)}: Final list of cookbooks to be available on the chef server:" # rubocop:disable Metrics/LineLength
141
+ if Chef::Config[:knife][:batali_show_remaining]
142
+ ui.info "#{ui.color("[Batali]", :green, :bold)}: Final list of cookbooks to be available on the chef server:" # rubocop:disable Metrics/LineLength
148
143
  opts[:manifest].sort.each do |name, versions|
149
144
  vers = versions.map do |v|
150
145
  Gem::Version.new(v)
151
- end.sort.map(&:to_s).join(', ')
146
+ end.sort.map(&:to_s).join(", ")
152
147
  ui.info " #{ui.color(name, :bold)}: #{vers}"
153
148
  end
154
149
  end
@@ -159,7 +154,7 @@ class Chef
159
154
  Smash.new.tap do |rm|
160
155
  opts[:server].each do |c_name, c_versions|
161
156
  kills = c_versions - opts[:manifest].fetch(c_name, [])
162
- unless(kills.empty?)
157
+ unless kills.empty?
163
158
  rm[c_name] = kills
164
159
  end
165
160
  end
@@ -170,7 +165,7 @@ class Chef
170
165
  Smash.new.tap do |add|
171
166
  opts[:manifest].each do |c_name, c_versions|
172
167
  adds = c_versions - opts[:server].fetch(c_name, [])
173
- unless(adds.empty?)
168
+ unless adds.empty?
174
169
  add[c_name] = adds
175
170
  end
176
171
  end
@@ -178,8 +173,8 @@ class Chef
178
173
  end
179
174
 
180
175
  def generate_manifest_cookbooks
181
- path = File.join(Dir.pwd, 'batali.manifest')
182
- unless(File.exist?(path))
176
+ path = File.join(Dir.pwd, "batali.manifest")
177
+ unless File.exist?(path)
183
178
  raise "Failed to locate batali manifest at: #{path}"
184
179
  end
185
180
  manifest = Batali::Manifest.build(path)
@@ -194,29 +189,28 @@ class Chef
194
189
 
195
190
  def generate_remote_cookbooks
196
191
  Smash.new.tap do |ckbks|
197
- rest.get('cookbooks?num_versions=all').map do |c_name, meta|
192
+ rest.get("cookbooks?num_versions=all").map do |c_name, meta|
198
193
  next if Chef::Config[:knife][:batali_blacklist].include?(c_name)
199
194
  ckbks[c_name] = []
200
- meta['versions'].each do |info|
201
- ckbks[c_name] << info['version']
195
+ meta["versions"].each do |info|
196
+ ckbks[c_name] << info["version"]
202
197
  end
203
198
  end
204
199
  end
205
200
  end
206
201
 
207
202
  def run_task(task)
208
- ui.stdout.print "#{ui.color('[Batali]', :green, :bold)}: #{task}... "
203
+ ui.stdout.print "#{ui.color("[Batali]", :green, :bold)}: #{task}... "
209
204
  begin
210
205
  value = yield if block_given?
211
- ui.info ui.color('complete', :green)
206
+ ui.info ui.color("complete", :green)
212
207
  value
213
208
  rescue => e
214
- ui.info ui.color('failed', :red, :bold)
209
+ ui.info ui.color("failed", :red, :bold)
215
210
  puts e.backtrace.join("\n")
216
211
  raise e
217
212
  end
218
213
  end
219
-
220
214
  end
221
215
  end
222
216
  end