Add function, uriescape, to URI.escape strings. Redmine #17459

This commit is contained in:
Joe Julian 2012-11-06 16:17:57 -08:00 committed by Jeff McCune
parent 65d9b10876
commit fd52b8d88a
2 changed files with 60 additions and 0 deletions

View file

@ -0,0 +1,36 @@
#
# uriescape.rb
#
require 'uri'
module Puppet::Parser::Functions
newfunction(:uriescape, :type => :rvalue, :doc => <<-EOS
Urlencodes a string or array of strings.
Requires either a single string or an array as an input.
EOS
) do |arguments|
raise(Puppet::ParseError, "uriescape(): Wrong number of arguments " +
"given (#{arguments.size} for 1)") if arguments.size < 1
value = arguments[0]
klass = value.class
unsafe = ":/?#[]@!$&'()*+,;= "
unless [Array, String].include?(klass)
raise(Puppet::ParseError, 'uriescape(): 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) ? URI.escape(i,unsafe) : i }
else
result = URI.escape(value,unsafe)
end
return result
end
end
# vim: set ts=2 sw=2 et :

View file

@ -0,0 +1,24 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'
describe "the uriescape function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
it "should exist" do
Puppet::Parser::Functions.function("uriescape").should == "function_uriescape"
end
it "should raise a ParseError if there is less than 1 arguments" do
lambda { scope.function_uriescape([]) }.should( raise_error(Puppet::ParseError))
end
it "should uriescape a string" do
result = scope.function_uriescape([":/?#[]@!$&'()*+,;= "])
result.should(eq('%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%20'))
end
it "should do nothing if a string is already safe" do
result = scope.function_uriescape(["ABCdef"])
result.should(eq('ABCdef'))
end
end