From 42743614cb13541a2973f28251b1f79a33019d77 Mon Sep 17 00:00:00 2001 From: Ryan McKern Date: Tue, 13 May 2014 15:01:44 -0700 Subject: (MODULES-905) Add bool2str() and camelcase() for string manipulation Python likes to have its constants Capitalized, and the capitalize function only understands strings... so I shave a yak. bool2str will convert a boolean to its equivalent string value, and camelcase extends on uppercase & downcase to convert an underscore delimited string into a camelcased string. --- lib/puppet/parser/functions/bool2str.rb | 30 +++++++++++++++++++++++++++++ lib/puppet/parser/functions/camelcase.rb | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 lib/puppet/parser/functions/bool2str.rb create mode 100644 lib/puppet/parser/functions/camelcase.rb (limited to 'lib/puppet') diff --git a/lib/puppet/parser/functions/bool2str.rb b/lib/puppet/parser/functions/bool2str.rb new file mode 100644 index 0000000..a97d356 --- /dev/null +++ b/lib/puppet/parser/functions/bool2str.rb @@ -0,0 +1,30 @@ +# +# bool2str.rb +# + +module Puppet::Parser::Functions + newfunction(:bool2str, :type => :rvalue, :doc => <<-EOS + Converts a boolean to a string. + Requires a single boolean or string as an input. + EOS + ) do |arguments| + + raise(Puppet::ParseError, "bool2str(): Wrong number of arguments " + + "given (#{arguments.size} for 1)") if arguments.size < 1 + + value = arguments[0] + klass = value.class + + # We can have either true or false, or string which resembles boolean ... + unless [FalseClass, TrueClass, String].include?(klass) + raise(Puppet::ParseError, 'bool2str(): Requires either ' + + 'boolean or string to work with') + end + + result = value.is_a?(String) ? value : value.to_s + + return result + end +end + +# vim: set ts=2 sw=2 et : diff --git a/lib/puppet/parser/functions/camelcase.rb b/lib/puppet/parser/functions/camelcase.rb new file mode 100644 index 0000000..d7f43f7 --- /dev/null +++ b/lib/puppet/parser/functions/camelcase.rb @@ -0,0 +1,33 @@ +# +# camelcase.rb +# + +module Puppet::Parser::Functions + newfunction(:camelcase, :type => :rvalue, :doc => <<-EOS +Converts the case of a string or all strings in an array to camel case. + EOS + ) do |arguments| + + raise(Puppet::ParseError, "camelcase(): Wrong number of arguments " + + "given (#{arguments.size} for 1)") if arguments.size < 1 + + value = arguments[0] + klass = value.class + + unless [Array, String].include?(klass) + raise(Puppet::ParseError, 'camelcase(): Requires either ' + + 'array or string to work with') + end + + if value.is_a?(Array) + # Numbers in Puppet are often string-encoded which is troublesome ... + result = value.collect { |i| i.is_a?(String) ? i.split('_').map{|e| e.capitalize}.join : i } + else + result = value.split('_').map{|e| e.capitalize}.join + end + + return result + end +end + +# vim: set ts=2 sw=2 et : -- cgit v1.2.3 From 6eaa592cd8d5af097a4624b3d1cead74408aabf2 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Wed, 14 May 2014 20:33:57 +0200 Subject: (PUP-2571) add 'before' functionality to file_line file_line supports adding lines after a match, but there are use cases when having "before" would be useful. For example, in Debian-based OS's, the last line of /etc/rc.local is "exit 0" it's an incredible pain to deal with that scenario today. This commit adds a 'before' parameter to the file_line type, and implements it for the ruby provider. --- lib/puppet/provider/file_line/ruby.rb | 16 +++++++++------- lib/puppet/type/file_line.rb | 4 ++++ 2 files changed, 13 insertions(+), 7 deletions(-) (limited to 'lib/puppet') diff --git a/lib/puppet/provider/file_line/ruby.rb b/lib/puppet/provider/file_line/ruby.rb index 94e7fac..2cbd172 100644 --- a/lib/puppet/provider/file_line/ruby.rb +++ b/lib/puppet/provider/file_line/ruby.rb @@ -9,7 +9,9 @@ Puppet::Type.type(:file_line).provide(:ruby) do if resource[:match] handle_create_with_match elsif resource[:after] - handle_create_with_after + handle_create_with_position :after + elsif resource[:before] + handle_create_with_position :before else append_line end @@ -49,29 +51,29 @@ Puppet::Type.type(:file_line).provide(:ruby) do end end - def handle_create_with_after - regex = Regexp.new(resource[:after]) + def handle_create_with_position(position) + regex = resource[position] ? Regexp.new(resource[position]) : nil count = lines.count {|l| l.match(regex)} case count - when 1 # find the line to put our line after + when 1 # find the line to put our line before/after File.open(resource[:path], 'w') do |fh| lines.each do |l| - fh.puts(l) + fh.puts(l) if position == :after if regex.match(l) then fh.puts(resource[:line]) end + fh.puts(l) if position == :before end end when 0 # append the line to the end of the file append_line else - raise Puppet::Error, "#{count} lines match pattern '#{resource[:after]}' in file '#{resource[:path]}'. One or no line must match the pattern." + raise Puppet::Error, "#{count} lines match pattern '#{resource[position]}' in file '#{resource[:path]}'. One or no line must match the pattern." end end - ## # append the line to the file. # # @api private diff --git a/lib/puppet/type/file_line.rb b/lib/puppet/type/file_line.rb index 323fc4c..bc6745f 100644 --- a/lib/puppet/type/file_line.rb +++ b/lib/puppet/type/file_line.rb @@ -46,6 +46,10 @@ Puppet::Type.newtype(:file_line) do desc 'An optional value used to specify the line after which we will add any new lines. (Existing lines are added in place)' end + newparam(:before) do + desc 'An optional value used to specify the line before which we will add any new lines. (Existing lines are added in place)' + end + newparam(:line) do desc 'The line to be appended to the file located by the path parameter.' end -- cgit v1.2.3 From c5b06f9bbca7acc491560c92a73d7e2a153fe0a7 Mon Sep 17 00:00:00 2001 From: Ashley Penney Date: Thu, 15 May 2014 17:28:59 -0400 Subject: Revert "Merge pull request #256 from stbenjam/2571-before" This reverts commit 8499ebdb7f892f2623295058649c67a5553d4732, reversing changes made to 08b00d9229961d7b3c3cba997bfb35c8d47e4c4b. --- lib/puppet/provider/file_line/ruby.rb | 16 +++++++--------- lib/puppet/type/file_line.rb | 4 ---- 2 files changed, 7 insertions(+), 13 deletions(-) (limited to 'lib/puppet') diff --git a/lib/puppet/provider/file_line/ruby.rb b/lib/puppet/provider/file_line/ruby.rb index 2cbd172..94e7fac 100644 --- a/lib/puppet/provider/file_line/ruby.rb +++ b/lib/puppet/provider/file_line/ruby.rb @@ -9,9 +9,7 @@ Puppet::Type.type(:file_line).provide(:ruby) do if resource[:match] handle_create_with_match elsif resource[:after] - handle_create_with_position :after - elsif resource[:before] - handle_create_with_position :before + handle_create_with_after else append_line end @@ -51,29 +49,29 @@ Puppet::Type.type(:file_line).provide(:ruby) do end end - def handle_create_with_position(position) - regex = resource[position] ? Regexp.new(resource[position]) : nil + def handle_create_with_after + regex = Regexp.new(resource[:after]) count = lines.count {|l| l.match(regex)} case count - when 1 # find the line to put our line before/after + when 1 # find the line to put our line after File.open(resource[:path], 'w') do |fh| lines.each do |l| - fh.puts(l) if position == :after + fh.puts(l) if regex.match(l) then fh.puts(resource[:line]) end - fh.puts(l) if position == :before end end when 0 # append the line to the end of the file append_line else - raise Puppet::Error, "#{count} lines match pattern '#{resource[position]}' in file '#{resource[:path]}'. One or no line must match the pattern." + raise Puppet::Error, "#{count} lines match pattern '#{resource[:after]}' in file '#{resource[:path]}'. One or no line must match the pattern." end end + ## # append the line to the file. # # @api private diff --git a/lib/puppet/type/file_line.rb b/lib/puppet/type/file_line.rb index bc6745f..323fc4c 100644 --- a/lib/puppet/type/file_line.rb +++ b/lib/puppet/type/file_line.rb @@ -46,10 +46,6 @@ Puppet::Type.newtype(:file_line) do desc 'An optional value used to specify the line after which we will add any new lines. (Existing lines are added in place)' end - newparam(:before) do - desc 'An optional value used to specify the line before which we will add any new lines. (Existing lines are added in place)' - end - newparam(:line) do desc 'The line to be appended to the file located by the path parameter.' end -- cgit v1.2.3 From 93c4151edfedb28a0cafa60011c57eb6d76ca6be Mon Sep 17 00:00:00 2001 From: Ryan McKern Date: Thu, 15 May 2014 15:01:14 -0700 Subject: (MODULES-905) Narrow the confinement in bool2str Previously, bool2str() accepted a broad array of boolean values and bare strings, without any attempt to validate that the strings in any way resembled "true" or "false" (or any of the other values bool2num() accepts). This commit narrows the input confinement to TrueClass and FalseClass, which means that bool2str() will only interpolate strict boolean values now. --- lib/puppet/parser/functions/bool2str.rb | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'lib/puppet') diff --git a/lib/puppet/parser/functions/bool2str.rb b/lib/puppet/parser/functions/bool2str.rb index a97d356..fcd3791 100644 --- a/lib/puppet/parser/functions/bool2str.rb +++ b/lib/puppet/parser/functions/bool2str.rb @@ -5,7 +5,7 @@ module Puppet::Parser::Functions newfunction(:bool2str, :type => :rvalue, :doc => <<-EOS Converts a boolean to a string. - Requires a single boolean or string as an input. + Requires a single boolean as an input. EOS ) do |arguments| @@ -15,15 +15,12 @@ module Puppet::Parser::Functions value = arguments[0] klass = value.class - # We can have either true or false, or string which resembles boolean ... - unless [FalseClass, TrueClass, String].include?(klass) - raise(Puppet::ParseError, 'bool2str(): Requires either ' + - 'boolean or string to work with') + # We can have either true or false, and nothing else + unless [FalseClass, TrueClass].include?(klass) + raise(Puppet::ParseError, 'bool2str(): Requires a boolean to work with') end - result = value.is_a?(String) ? value : value.to_s - - return result + return value.to_s end end -- cgit v1.2.3