Skip to content

Commit

Permalink
Merge pull request #368 from rfugina/basename
Browse files Browse the repository at this point in the history
Basename implementation
  • Loading branch information
Morgan Haskel committed Dec 17, 2014
2 parents 8726caf + ef3d42f commit 841b0df
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 0 deletions.
7 changes: 7 additions & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,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.
Expand Down
34 changes: 34 additions & 0 deletions lib/puppet/parser/functions/basename.rb
Original file line number Diff line number Diff line change
@@ -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 changes: 46 additions & 0 deletions spec/unit/puppet/parser/functions/basename_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 841b0df

Please sign in to comment.