summaryrefslogtreecommitdiff
path: root/lib/chef/util/editor.rb
diff options
context:
space:
mode:
authorChris Bandy <bandy.chris@gmail.com>2014-01-10 07:04:00 +0000
committerBryan McLellan <btm@getchef.com>2014-03-19 14:39:24 -0700
commit963e33beb327162dd03b8b4d37789a53914b8ba8 (patch)
treeb83e91b9176b0e34b744a8373f50f4f6705554bc /lib/chef/util/editor.rb
parent4c5eb3eeff27f58009cc45de18f97d27d9d1355c (diff)
downloadchef-963e33beb327162dd03b8b4d37789a53914b8ba8.tar.gz
CHEF-3714: New object dedicated to manipulating text
Diffstat (limited to 'lib/chef/util/editor.rb')
-rw-r--r--lib/chef/util/editor.rb92
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/chef/util/editor.rb b/lib/chef/util/editor.rb
new file mode 100644
index 0000000000..973cf48e30
--- /dev/null
+++ b/lib/chef/util/editor.rb
@@ -0,0 +1,92 @@
+#
+# Author:: Chris Bandy (<bandy.chris@gmail.com>)
+# Copyright:: Copyright (c) 2014 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class Chef
+ class Util
+ class Editor
+ attr_reader :lines
+
+ def initialize(lines)
+ @lines = lines.to_a.clone
+ end
+
+ def append_line_after(search, line_to_append)
+ lines = []
+
+ @lines.each do |line|
+ lines << line
+ lines << line_to_append if line.match(search)
+ end
+
+ (lines.length - @lines.length).tap { @lines = lines }
+ end
+
+ def append_line_if_missing(search, line_to_append)
+ count = 0
+
+ unless @lines.find { |line| line.match(search) }
+ count = 1
+ @lines << line_to_append
+ end
+
+ count
+ end
+
+ def remove_lines(search)
+ count = 0
+
+ @lines.delete_if do |line|
+ count += 1 if line.match(search)
+ end
+
+ count
+ end
+
+ def replace(search, replace)
+ count = 0
+
+ @lines.map! do |line|
+ if line.match(search)
+ count += 1
+ line.gsub!(search, replace)
+ else
+ line
+ end
+ end
+
+ count
+ end
+
+ def replace_lines(search, replace)
+ count = 0
+
+ @lines.map! do |line|
+ if line.match(search)
+ count += 1
+ replace
+ else
+ line
+ end
+ end
+
+ count
+ end
+ end
+ end
+end
+