Skip to content

Commit

Permalink
(MAINT) validate_re: Clarify docs and error message
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidS committed Sep 17, 2015
1 parent 399ce03 commit 55ece78
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 2 deletions.
7 changes: 7 additions & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -1054,6 +1054,13 @@ test, and the second argument should be a stringified regular expression (withou
validate_re($::puppetversion, '^2.7', 'The $puppetversion fact value does not match 2.7')
~~~

Note: Compilation will also abort, if the first argument is not a String. Always use
quotes to force stringification:

~~~
validate_re("${::operatingsystemmajrelease}", '^[57]$')
~~~

*Type*: statement.

#### `validate_slength`
Expand Down
11 changes: 9 additions & 2 deletions lib/puppet/parser/functions/validate_re.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,23 @@ module Puppet::Parser::Functions
validate_re($::puppetversion, '^2.7', 'The $puppetversion fact value does not match 2.7')
Note: Compilation will also abort, if the first argument is not a String. Always use
quotes to force stringification:
validate_re("${::operatingsystemmajrelease}", '^[57]$')
ENDHEREDOC
if (args.length < 2) or (args.length > 3) then
raise Puppet::ParseError, ("validate_re(): wrong number of arguments (#{args.length}; must be 2 or 3)")
raise Puppet::ParseError, "validate_re(): wrong number of arguments (#{args.length}; must be 2 or 3)"
end

raise Puppet::ParseError, "validate_re(): input needs to be a String, not a #{args[0].class}" unless args[0].is_a? String

msg = args[2] || "validate_re(): #{args[0].inspect} does not match #{args[1].inspect}"

# We're using a flattened array here because we can't call String#any? in
# Ruby 1.9 like we can in Ruby 1.8
raise Puppet::ParseError, (msg) unless [args[1]].flatten.any? do |re_str|
raise Puppet::ParseError, msg unless [args[1]].flatten.any? do |re_str|
args[0] =~ Regexp.compile(re_str)
end

Expand Down
15 changes: 15 additions & 0 deletions spec/functions/validate_re_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,21 @@
it { is_expected.to run.with_params('notone', '^one').and_raise_error(Puppet::ParseError, /does not match/) }
it { is_expected.to run.with_params('notone', [ '^one', '^two' ]).and_raise_error(Puppet::ParseError, /does not match/) }
it { is_expected.to run.with_params('notone', [ '^one', '^two' ], 'custom error').and_raise_error(Puppet::ParseError, /custom error/) }

describe 'non-string inputs' do
[
1, # Fixnum
3.14, # Float
nil, # NilClass
true, # TrueClass
false, # FalseClass
["10"], # Array
:key, # Symbol
{:key=>"val"}, # Hash
].each do |input|
it { is_expected.to run.with_params(input, '.*').and_raise_error(Puppet::ParseError, /needs to be a String/) }
end
end
end
end
end

0 comments on commit 55ece78

Please sign in to comment.