class Thor::Actions::InjectIntoFile
:nodoc:
def initialize(base, destination, data, config)
def initialize(base, destination, data, config) super(base, destination, {:verbose => true}.merge(config)) @behavior, @flag = if @config.key?(:after) [:after, @config.delete(:after)] else [:before, @config.delete(:before)] end @replacement = data.is_a?(Proc) ? data.call : data @flag = Regexp.escape(@flag) unless @flag.is_a?(Regexp) end
def invoke!
def invoke! content = if @behavior == :after '\0' + replacement else replacement + '\0' end if exists? if replace!(/#{flag}/, content, config[:force]) say_status(:invoke) else say_status(:unchanged, warning: WARNINGS[:unchanged_no_flag], color: :red) end else unless pretend? raise Thor::Error, "The file #{ destination } does not appear to exist" end end end
def replace!(regexp, string, force)
Adds the content to the file.
def replace!(regexp, string, force) return if pretend? content = File.read(destination) if force || !content.include?(replacement) success = content.gsub!(regexp, string) File.open(destination, "wb") { |file| file.write(content) } success end end
def revoke!
def revoke! say_status :revoke regexp = if @behavior == :after content = '\1\2' /(#{flag})(.*)(#{Regexp.escape(replacement)})/m else content = '\2\3' /(#{Regexp.escape(replacement)})(.*)(#{flag})/m end replace!(regexp, content, true) end
def say_status(behavior, warning: nil, color: nil)
def say_status(behavior, warning: nil, color: nil) status = if behavior == :invoke if flag == /\A/ :prepend elsif flag == /\z/ :append else :insert end elsif warning warning else :subtract end super(status, (color || config[:verbose])) end