class ChefCLI::Command::GeneratorCommands::Cookbook

## CookbookFile chef generate cookbook path/to/basename –generator-cookbook=path/to/generator

Generates a basic cookbook directory structure. Most file types are omitted, the user is expected to add additional files as needed using the relevant generators.

Attributes

cookbook_name_or_path[R]
errors[R]

Public Class Methods

new(params) click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 93
def initialize(params)
  @params_valid = true
  @cookbook_name = nil
  @policy_mode = true
  @verbose = false
  @specs = false
  super
end

Public Instance Methods

cookbook_full_path() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 197
def cookbook_full_path
  File.expand_path(cookbook_name_or_path, Dir.pwd)
end
cookbook_name() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 189
def cookbook_name
  File.basename(cookbook_full_path)
end
cookbook_path_in_git_repo?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 263
def cookbook_path_in_git_repo?
  Pathname.new(cookbook_full_path).ascend do |dir|
    return true if File.directory?(File.join(dir.to_s, ".git"))
  end
  false
end
cookbook_root() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 193
def cookbook_root
  File.dirname(cookbook_full_path)
end
create_vscode_dir?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 270
def create_vscode_dir?
  ::File.exist?("/Applications/Visual Studio Code.app") || ::File.exist?("#{ENV["APPDATA"]}\\Code")
end
emit_post_create_message() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 120
def emit_post_create_message
  default_recipe_file = yaml ? "default.yml" : "default.rb"
  if have_delivery_config?
    msg("Your cookbook is ready. To setup the pipeline, type `cd #{cookbook_name_or_path}`, then run `delivery init`")
  else
    msg("Your cookbook is ready. Type `cd #{cookbook_name_or_path}` to enter it.")
    msg("\nThere are several commands you can run to get started locally developing and testing your cookbook.")
    msg("Type `delivery local --help` to see a full list of local testing commands.")
    msg("\nWhy not start by writing an InSpec test? Tests for the default recipe are stored at:\n")
    msg("test/integration/default/default_test.rb")
    msg("\nIf you'd prefer to dive right in, the default recipe can be found at:")
    msg("\nrecipes/#{default_recipe_file}\n")
  end
end
enable_workflow?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 205
def enable_workflow?
  config[:workflow]
end
have_delivery_config?() click to toggle source

Is there a .delivery/cli.toml in the current dir or any of the parent dirs

@return [Boolean]

# File lib/chef-cli/command/generator_commands/cookbook.rb, line 222
def have_delivery_config?
  # delivery-cli's logic is to look recursively upward for
  # .delivery/cli.toml starting from pwd:
  # https://github.com/chef/delivery-cli/blob/22cbef3987ebd0aee98405b7e161a100edc87e49/src/delivery/config/mod.rs#L225-L247

  Pathname.pwd.ascend.any? { |path| path.join(".delivery/cli.toml").exist? }
end
kitchen() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 161
def kitchen
  config[:kitchen]
end
params_valid?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 259
def params_valid?
  @params_valid
end
pipeline() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 165
def pipeline
  config[:pipeline]
end
policy_mode?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 201
def policy_mode?
  @policy_mode
end
policy_name() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 173
def policy_name
  cookbook_name
end
policy_run_list() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 177
def policy_run_list
  "#{cookbook_name}::#{recipe_name}"
end
read_and_validate_params() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 230
def read_and_validate_params
  arguments = parse_options(params)
  @cookbook_name_or_path = arguments[0]
  if !@cookbook_name_or_path
    @params_valid = false
  elsif File.basename(@cookbook_name_or_path).include?("-")
    msg("Hyphens are discouraged in cookbook names as they may cause problems with custom resources. See https://docs.chef.io/workstation/ctl_chef/#chef-generate-cookbook for more information.")
  end

  if config[:berks] && config[:policy]
    err("Berkshelf and Policyfiles are mutually exclusive. Please specify only one.")
    @params_valid = false
  end

  if config[:berks]
    @policy_mode = false
  end

  if config[:verbose]
    @verbose = true
  end

  if config[:specs]
    @specs = true
  end

  true
end
recipe() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 181
def recipe
  "cookbook"
end
recipe_name() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 185
def recipe_name
  "default"
end
run() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 102
def run
  read_and_validate_params
  if params_valid?
    setup_context
    msg("Generating cookbook #{cookbook_name}")
    chef_runner.converge
    msg("")
    emit_post_create_message
    0
  else
    err(opt_parser)
    1
  end
rescue ChefCLI::ChefRunnerError => e
  err("ERROR: #{e}")
  1
end
setup_context() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 135
def setup_context
  super
  Generator.add_attr_to_context(:skip_git_init, cookbook_path_in_git_repo?)
  Generator.add_attr_to_context(:cookbook_root, cookbook_root)
  Generator.add_attr_to_context(:cookbook_name, cookbook_name)
  Generator.add_attr_to_context(:recipe_name, recipe_name)
  Generator.add_attr_to_context(:include_chef_repo_source, false)
  Generator.add_attr_to_context(:policy_name, policy_name)
  Generator.add_attr_to_context(:policy_run_list, policy_run_list)
  Generator.add_attr_to_context(:policy_local_cookbook, ".")

  Generator.add_attr_to_context(:enable_workflow, enable_workflow?)
  Generator.add_attr_to_context(:workflow_project_dir, cookbook_full_path)
  Generator.add_attr_to_context(:build_cookbook_parent_is_cookbook, true)
  Generator.add_attr_to_context(:workflow_project_git_initialized, have_git? && !cookbook_path_in_git_repo?)

  Generator.add_attr_to_context(:verbose, verbose?)
  Generator.add_attr_to_context(:specs, specs?)

  Generator.add_attr_to_context(:use_policyfile, policy_mode?)
  Generator.add_attr_to_context(:pipeline, pipeline)
  Generator.add_attr_to_context(:kitchen, kitchen)
  Generator.add_attr_to_context(:vscode_dir, create_vscode_dir?)
  Generator.add_attr_to_context(:yaml, yaml)
end
specs?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 213
def specs?
  @specs
end
verbose?() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 209
def verbose?
  @verbose
end
yaml() click to toggle source
# File lib/chef-cli/command/generator_commands/cookbook.rb, line 169
def yaml
  config[:yaml]
end