Issue #14654 has been updated by Jeff McCune.
@Pieter, you should have a look at this one too. ---------------------------------------- Feature #14654: :undef should not be synonymous with the empty string in Puppet if/case/selector https://projects.puppetlabs.com/issues/14654#change-66222 Author: Reid Vandewiele Status: Accepted Priority: Normal Assignee: Category: Target version: Waldorf Affected Puppet version: Keywords: Branch: This feature request is a spin-off of the resolution of #8778. In trying to trace back through :undef-related tickets in order to get a better idea of what the intention moving forward is, I unearthed issues #4692, #6621, #6745, #8783, and #13210. Most of those tickets were about exposing the :undef symbol in ruby (custom functions, templates) but in a completely biased fashion I came up with a few quotes that I think are more generally applicable to the use of 'undef' in the Puppet DSL. Paul Berry in #4692: > We’d intended for :undef to only be used internally within Puppet to > distinguish between undefined variables and variables whose values are the > empty string. Matt Robinson in #8783: > Puppet’s concept of undef seems fairly easy to confuse with empty string, > Ruby’s nil, and often gets exposed through the symbol :undef when it > shouldn’t. It doesn’t seem to me like there’s an overall philosophy behind > undef and how it should be treated in Puppet. Chris Price in #13210: > [...] there are cases in the world where there is a meaningful semantic > distinction between “null” and an empty string (plenty of precedent for this > in relational databases, etc.), and [...] our current implementation > explicitly prevents users from handling that distinction. It's because of the latter-most sentiment that code I am familiar with deliberately checks to see if values are undef rather than empty strings (`if $val == undef`), and expects there to be a difference. These checks all break starting with Puppet 2.7.15 as a result of the #8778 resolution. The style guide currently recommends against checking to see if a value is undef, suggesting instead that a picked-from-a-hat 'UNSET' string should be used in class parameter defaults and that DSL code should be written to handle that conventionally defined string rather than using a language-level "null" check. The fact that this used to work (with :undef) was a bug. Fixing the #8778 bug resulted in Puppet more consistently enforcing the inconsistency of :undef in the Puppet DSL. Consider the following example which for 2.7.15rc1 or greater demonstrates a situation in which :undef is already not synonymous with the empty string. notify { "if message is undef, the title will be used instead": message => undef, } if "" == undef { notify { "then this message should not be empty": message => "", } } ## Feature Request ## In order to allow users to account for the meaningful distinction between "null" and an empty string, :undef should not be synonymous with the empty string in Puppet if/case/selector. For if/case/selector checks, it should be that undef == undef, but nothing else. undef != '' and '' != undef. -- 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 post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-bugs?hl=en.
