diff options
| author | Rob Fugina <rfugina@genome.wustl.edu> | 2014-11-17 16:01:42 -0600 | 
|---|---|---|
| committer | Rob Fugina <rfugina@genome.wustl.edu> | 2014-12-17 12:39:40 -0600 | 
| commit | ef3d42f7bbdf95b21f46e580de309298cad300ea (patch) | |
| tree | d4cf331b1ff8c7b10974cd8d20325272268d3182 | |
| parent | c5467cc507c004d75037d07c70633d1e743825af (diff) | |
| download | puppet-stdlib-ef3d42f7bbdf95b21f46e580de309298cad300ea.tar.gz puppet-stdlib-ef3d42f7bbdf95b21f46e580de309298cad300ea.tar.bz2  | |
Added basename() based on Ruby's File.basename
Based on dirname code.  Includes RSpec tests and docs.
| -rw-r--r-- | README.markdown | 7 | ||||
| -rw-r--r-- | lib/puppet/parser/functions/basename.rb | 34 | ||||
| -rwxr-xr-x | spec/unit/puppet/parser/functions/basename_spec.rb | 46 | 
3 files changed, 87 insertions, 0 deletions
diff --git a/README.markdown b/README.markdown index 78839c6..67ef313 100644 --- a/README.markdown +++ b/README.markdown @@ -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. diff --git a/lib/puppet/parser/functions/basename.rb b/lib/puppet/parser/functions/basename.rb new file mode 100644 index 0000000..f7e4438 --- /dev/null +++ b/lib/puppet/parser/functions/basename.rb @@ -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 : diff --git a/spec/unit/puppet/parser/functions/basename_spec.rb b/spec/unit/puppet/parser/functions/basename_spec.rb new file mode 100755 index 0000000..8a2d0dc --- /dev/null +++ b/spec/unit/puppet/parser/functions/basename_spec.rb @@ -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  | 
