Added basename() based on Ruby's File.basename

Based on dirname code.  Includes RSpec tests and docs.
This commit is contained in:
Rob Fugina 2014-11-17 16:01:42 -06:00
parent c5467cc507
commit ef3d42f7bb
3 changed files with 87 additions and 0 deletions

View file

@ -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.

View 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 :

View 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