Added basename() based on Ruby's File.basename
Based on dirname code. Includes RSpec tests and docs.
This commit is contained in:
parent
c5467cc507
commit
ef3d42f7bb
3 changed files with 87 additions and 0 deletions
|
@ -84,6 +84,13 @@ If you want to use a standardized set of run stages for Puppet, `include stdlib`
|
|||
Requires an action ('encode', 'decode') and either a plain or base64-encoded
|
||||
string. *Type*: rvalue
|
||||
|
||||
* `basename`: Returns the `basename` of a path (optionally stripping an extension). For example:
|
||||
* ('/path/to/a/file.ext') returns 'file.ext'
|
||||
* ('relative/path/file.ext') returns 'file.ext'
|
||||
* ('/path/to/a/file.ext', '.ext') returns 'file'
|
||||
|
||||
*Type*: rvalue
|
||||
|
||||
* `bool2num`: Converts a boolean to a number. Converts values:
|
||||
* 'false', 'f', '0', 'n', and 'no' to 0.
|
||||
* 'true', 't', '1', 'y', and 'yes' to 1.
|
||||
|
|
34
lib/puppet/parser/functions/basename.rb
Normal file
34
lib/puppet/parser/functions/basename.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
module Puppet::Parser::Functions
|
||||
newfunction(:basename, :type => :rvalue, :doc => <<-EOS
|
||||
Strips directory (and optional suffix) from a filename
|
||||
EOS
|
||||
) do |arguments|
|
||||
|
||||
if arguments.size < 1 then
|
||||
raise(Puppet::ParseError, "basename(): No arguments given")
|
||||
elsif arguments.size > 2 then
|
||||
raise(Puppet::ParseError, "basename(): Too many arguments given (#{arguments.size})")
|
||||
else
|
||||
|
||||
unless arguments[0].is_a?(String)
|
||||
raise(Puppet::ParseError, 'basename(): Requires string as first argument')
|
||||
end
|
||||
|
||||
if arguments.size == 1 then
|
||||
rv = File.basename(arguments[0])
|
||||
elsif arguments.size == 2 then
|
||||
|
||||
unless arguments[1].is_a?(String)
|
||||
raise(Puppet::ParseError, 'basename(): Requires string as second argument')
|
||||
end
|
||||
|
||||
rv = File.basename(arguments[0], arguments[1])
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return rv
|
||||
end
|
||||
end
|
||||
|
||||
# vim: set ts=2 sw=2 et :
|
46
spec/unit/puppet/parser/functions/basename_spec.rb
Executable file
46
spec/unit/puppet/parser/functions/basename_spec.rb
Executable file
|
@ -0,0 +1,46 @@
|
|||
#! /usr/bin/env ruby -S rspec
|
||||
require 'spec_helper'
|
||||
|
||||
describe "the basename function" do
|
||||
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
|
||||
|
||||
it "should exist" do
|
||||
Puppet::Parser::Functions.function("basename").should == "function_basename"
|
||||
end
|
||||
|
||||
it "should raise a ParseError if there is less than 1 argument" do
|
||||
lambda { scope.function_basename([]) }.should( raise_error(Puppet::ParseError))
|
||||
end
|
||||
|
||||
it "should raise a ParseError if there are more than 2 arguments" do
|
||||
lambda { scope.function_basename(['a', 'b', 'c']) }.should( raise_error(Puppet::ParseError))
|
||||
end
|
||||
|
||||
it "should return basename for an absolute path" do
|
||||
result = scope.function_basename(['/path/to/a/file.ext'])
|
||||
result.should(eq('file.ext'))
|
||||
end
|
||||
|
||||
it "should return basename for a relative path" do
|
||||
result = scope.function_basename(['path/to/a/file.ext'])
|
||||
result.should(eq('file.ext'))
|
||||
end
|
||||
|
||||
it "should strip extention when extension specified (absolute path)" do
|
||||
result = scope.function_basename(['/path/to/a/file.ext', '.ext'])
|
||||
result.should(eq('file'))
|
||||
end
|
||||
|
||||
it "should strip extention when extension specified (relative path)" do
|
||||
result = scope.function_basename(['path/to/a/file.ext', '.ext'])
|
||||
result.should(eq('file'))
|
||||
end
|
||||
|
||||
it "should complain about non-string first argument" do
|
||||
lambda { scope.function_basename([[]]) }.should( raise_error(Puppet::ParseError))
|
||||
end
|
||||
|
||||
it "should complain about non-string second argument" do
|
||||
lambda { scope.function_basename(['/path/to/a/file.ext', []]) }.should( raise_error(Puppet::ParseError))
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue