Issue #21974 has been reported by Joshua Hoblitt.

----------------------------------------
Bug #21974: DIE :undef, DIE!
https://projects.puppetlabs.com/issues/21974

* Author: Joshua Hoblitt
* Status: Unreviewed
* Priority: Normal
* Assignee: 
* Category: API
* Target version: 
* Affected Puppet version: 3.2.3
* Keywords: :undef nil erb evil
* Branch: 
----------------------------------------
I'm not sure if this should be flagged as a bug, a feature, or a refactor 
because this issue covers all three. :)

Yesterday afternoon I discovered a template in a fairly popular module that did 
not work correctly on puppet 3.2.1 due to it's use of `:undef`.  The fix was to 
replace `:undef` with `#nil?`.

    @@ -14,10 +14,10 @@ server {
       ssl_protocols             <%= @ssl_protocols %>;
       ssl_ciphers               <%= @ssl_ciphers %>;
       ssl_prefer_server_ciphers on;
    -<% if @auth_basic != :undef -%>
    +<% unless @auth_basic.nil? -%> 
       auth_basic                "<%= @auth_basic %>";
     <% end -%>
    -<% if @auth_basic_user_file != :undef -%>
    +<% unless @auth_basic_user_file.nil? -%>
       auth_basic_user_file      <%= @auth_basic_user_file %>;
     <% end -%>

It appears that in at least some cases (perhaps limited to erb?) real `nil`s 
are leaking out instead of `:undef`.  I've unable to pass an `:undef` into a 
template at all in testing in either 3.2.1 or 3.2.3.  I don't know if this has 
ever worked or is a regression.

    $ cat undef_test.pp
    notify{'undeclared': message => inline_template('<%= @foo == :undef %> : 
<%= @foo.nil? %>')}

    $empty = ''
    notify{'empty': message => inline_template('<%= @empty == :undef %> : <%= 
@empty.nil? %>')}

    $undef = undef
    notify{'undef': message => inline_template('<%= @undef == :undef %> : <%= 
@undef.nil? %>')}

    $false = false
    notify{'false': message => inline_template('<%= @false == :undef %> : <%= 
@false.nil? %>')}

    $ puppet --version
    3.2.3
    $ puppet apply undef_test.pp                          
    Notice: false : false
    Notice: /Stage[main]//Notify[false]/message: defined 'message' as 'false : 
false'
    Notice: false : false
    Notice: /Stage[main]//Notify[empty]/message: defined 'message' as 'false : 
false'
    Notice: false : true
    Notice: /Stage[main]//Notify[undeclared]/message: defined 'message' as 
'false : true'
    Notice: false : true
    Notice: /Stage[main]//Notify[undef]/message: defined 'message' as 'false : 
true'
    Notice: Finished catalog run in 0.11 seconds

Upon digging into the puppet source, it appears that usage and testing for 
`:undef` is inconsistent in the core.  

Consider `Puppet::Parser::Scope#true?` that tests for `:undef` to be used as a 
boolean value. 
https://github.com/puppetlabs/puppet/blob/3.2.3/lib/puppet/parser/scope.rb#L113-L122
 . Elsewhere in the same class `:undef` is being checked for directly 
https://github.com/puppetlabs/puppet/blob/3.2.3/lib/puppet/parser/scope.rb#L392

The case against `:undef`

 * It violates the princible of 'least surprise' in that it duplicates a built 
in language feature
 * In at least some circumstances `nil` leaks out in place of `:undef`
 * Test coverage of `:undef` is insufficent
 * Usage of `:undef` appears inconsistent in the core

I'd agrue that in stead of trying to replicate/maintain externally visible 
inconsistent behavior that it would be better to just remove `:undef` 
completely and deal with the API change all at once, perhaps in a 3.3.0 
release. 


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-bugs.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to