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