StringBlockEditor to help plugins with owning parts of files
This commit is contained in:
parent
ec47d214f0
commit
335503a688
|
@ -0,0 +1,66 @@
|
||||||
|
module Vagrant
|
||||||
|
module Util
|
||||||
|
# This class modifies strings by creating and managing Vagrant-owned
|
||||||
|
# "blocks" via wrapping them in specially formed comments.
|
||||||
|
#
|
||||||
|
# This is useful when modifying a file that someone else owns and adding
|
||||||
|
# automatic entries into it. Example: /etc/exports or some other
|
||||||
|
# configuration file.
|
||||||
|
#
|
||||||
|
# Vagrant marks ownership of a block in the string by wrapping it in
|
||||||
|
# VAGRANT-BEGIN and VAGRANT-END comments with a unique ID. Example:
|
||||||
|
#
|
||||||
|
# foo
|
||||||
|
# # VAGRANT-BEGIN: id
|
||||||
|
# some contents
|
||||||
|
# created by vagrant
|
||||||
|
# # VAGRANT-END: id
|
||||||
|
#
|
||||||
|
# The goal of this class is to be able to insert and remove these
|
||||||
|
# blocks without modifying anything else in the string.
|
||||||
|
#
|
||||||
|
# The strings usually come from files but it is up to the caller to
|
||||||
|
# manage the file resource.
|
||||||
|
class StringBlockEditor
|
||||||
|
# The current string value. This is the value that is modified by
|
||||||
|
# the methods below.
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
attr_reader :value
|
||||||
|
|
||||||
|
def initialize(string)
|
||||||
|
@value = string
|
||||||
|
end
|
||||||
|
|
||||||
|
# This returns the keys (or ids) that are in the string.
|
||||||
|
#
|
||||||
|
# @return [<Array<String>]
|
||||||
|
def keys
|
||||||
|
regexp = /^#\s*VAGRANT-BEGIN:\s*(.+?)$(.*)^#\s*VAGRANT-END:\s(\1)$/m
|
||||||
|
@value.scan(regexp).map do |match|
|
||||||
|
match[0]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This deletes the block with the given key if it exists.
|
||||||
|
def delete(key)
|
||||||
|
regexp = /^#\s*VAGRANT-BEGIN:\s*#{key}$.*^#\s*VAGRANT-END:\s*#{key}$\r?\n?/m
|
||||||
|
@value.gsub!(regexp, "")
|
||||||
|
end
|
||||||
|
|
||||||
|
# This inserts a block with the given key and value.
|
||||||
|
#
|
||||||
|
# @param [String] key
|
||||||
|
# @param [String] value
|
||||||
|
def insert(key, value)
|
||||||
|
new_block = <<BLOCK
|
||||||
|
# VAGRANT-BEGIN: #{key}
|
||||||
|
#{value}
|
||||||
|
# VAGRANT-END: #{key}
|
||||||
|
BLOCK
|
||||||
|
|
||||||
|
@value << "\n#{new_block}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,78 @@
|
||||||
|
require File.expand_path("../../../base", __FILE__)
|
||||||
|
|
||||||
|
require "vagrant/util/string_block_editor"
|
||||||
|
|
||||||
|
describe Vagrant::Util::StringBlockEditor do
|
||||||
|
describe "#keys" do
|
||||||
|
it "should return all the keys" do
|
||||||
|
data = <<DATA
|
||||||
|
# VAGRANT-BEGIN: foo
|
||||||
|
value
|
||||||
|
# VAGRANT-END: foo
|
||||||
|
another
|
||||||
|
# VAGRANT-BEGIN: bar
|
||||||
|
content
|
||||||
|
# VAGRANT-END: bar
|
||||||
|
DATA
|
||||||
|
|
||||||
|
described_class.new(data).keys.should == ["foo", "bar"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#delete" do
|
||||||
|
it "should delete nothing if the key doesn't exist" do
|
||||||
|
data = "foo"
|
||||||
|
|
||||||
|
instance = described_class.new(data)
|
||||||
|
instance.delete("key")
|
||||||
|
instance.value.should == data
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should delete the matching blocks if they exist" do
|
||||||
|
data = <<DATA
|
||||||
|
# VAGRANT-BEGIN: foo
|
||||||
|
value
|
||||||
|
# VAGRANT-END: foo
|
||||||
|
# VAGRANT-BEGIN: foo
|
||||||
|
another
|
||||||
|
# VAGRANT-END: foo
|
||||||
|
another
|
||||||
|
# VAGRANT-BEGIN: bar
|
||||||
|
content
|
||||||
|
# VAGRANT-END: bar
|
||||||
|
DATA
|
||||||
|
|
||||||
|
new_data = <<DATA
|
||||||
|
another
|
||||||
|
# VAGRANT-BEGIN: bar
|
||||||
|
content
|
||||||
|
# VAGRANT-END: bar
|
||||||
|
DATA
|
||||||
|
|
||||||
|
instance = described_class.new(data)
|
||||||
|
instance.delete("foo")
|
||||||
|
instance.value.should == new_data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#insert" do
|
||||||
|
it "should insert the given key and value" do
|
||||||
|
data = <<DATA
|
||||||
|
# VAGRANT-BEGIN: bar
|
||||||
|
content
|
||||||
|
# VAGRANT-END: bar
|
||||||
|
DATA
|
||||||
|
|
||||||
|
new_data = <<DATA
|
||||||
|
#{data}
|
||||||
|
# VAGRANT-BEGIN: foo
|
||||||
|
value
|
||||||
|
# VAGRANT-END: foo
|
||||||
|
DATA
|
||||||
|
|
||||||
|
instance = described_class.new(data)
|
||||||
|
instance.insert("foo", "value")
|
||||||
|
instance.value.should == new_data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue