class Copypasta::Plan

Attributes

contents[R]
root[R]
settings[R]

Public Class Methods

from_directory(root) click to toggle source
# File lib/copypasta/plan.rb, line 67
def self.from_directory(root)
  raise "#{root} doesn't exist." unless Dir.exist?(root)
  root = File.expand_path(root)

  settings = Copypasta::Settings.from_file("#{root}/_settings.rb")
  contents = Copypasta::Contents.from_tree(root)

  Copypasta::Plan.new(settings: settings, contents: contents)
end
new(settings:, contents: []) click to toggle source
# File lib/copypasta/plan.rb, line 10
def initialize(settings:, contents: [])
  raise "settings must be a Copypasta::Settings" \
    unless settings.is_a?(Copypasta::Settings)

  raise "'contents' must be an Array of Copypasta::Contents." \
    unless contents.is_a?(Array) && contents.all? { |c| c.is_a?(Copypasta::Contents) }

  @settings = settings.dup.freeze
  @contents = contents.dup.freeze
end

Public Instance Methods

apply(parameters, destination_directory, force: false) click to toggle source
# File lib/copypasta/plan.rb, line 55
def apply(parameters, destination_directory, force: false)
  # TODO: validate the parameters, then call all of the entries with the
  #       parameter set

  raise "parameter set is invalid, check the logs." \
    unless parameters_valid?(parameters)
  raise "Directory is dirty. Use force to create anyway." \
    if !force && !directory_clean?(destination_directory)

  contents.each { |c| c.apply(destination_directory, parameters) }
end
interrogate(parameters) click to toggle source
# File lib/copypasta/plan.rb, line 21
def interrogate(parameters)
  raise "#interrogate can only be called when STDOUT is a tty?." \
    unless STDOUT.tty?
  # TODO: check to see if the parameter exists; if it doesn't, ask on the
  #       tty for a value.
  # TODO: decide whether to notify-and-retry or fail on invalid parameter.

  require "highline"
  cli = HighLine.new

  missing_parameters =
    settings.parameter_definitions
            .values.select { |pd| parameters[pd.name].nil? }

  missing_parameters.each do |pd|
    puts pd.description
    answer = cli.ask("#{pd.name}: ") { |q| q.default = pd.default }

    answer = pd.postprocess.call(answer) unless pd.postprocess.nil?

    puts "Received parameter '#{pd.name}': '#{answer}'"

    parameters[pd.name] = answer
  end

  parameters
end
parameters_valid?(parameters) click to toggle source
# File lib/copypasta/plan.rb, line 49
def parameters_valid?(parameters)
  ret = @settings.validate(parameters)

  ret.all?(&:empty?)
end

Private Instance Methods

directory_clean?(destination) click to toggle source
# File lib/copypasta/plan.rb, line 79
def directory_clean?(destination)
  Dir["#{destination}/*"].reject { |f| f == ".." || f == "." }.empty?
end