Add function, uriescape, to URI.escape strings. Redmine #17459
This commit is contained in:
parent
65d9b10876
commit
fd52b8d88a
2 changed files with 60 additions and 0 deletions
36
lib/puppet/parser/functions/uriescape.rb
Normal file
36
lib/puppet/parser/functions/uriescape.rb
Normal 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 :
|
24
spec/unit/puppet/parser/functions/uriescape_spec.rb
Normal file
24
spec/unit/puppet/parser/functions/uriescape_spec.rb
Normal 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
|
Loading…
Reference in a new issue