(#16178) Handle the case where temp_answer is false but defined.

Consider:

````
  class foomodule::params {
    $myitem = false
    ...
````

The current code won't handle this because `if temp_answer` is the same
as `if false`.

This commit changes it to use `temp_anser.nil?` instead.
(#16178) Add test for behavior of false values in lookup

This adds a test around the fix to treat a false value in a hierarchy as
a real value.
(Maint) Require Hiera::Backend where it is used

Previously the Hiera::Backend::Puppet_backend code assumed that
Hiera::Backend had already been included. This was not true, at least in
the tests. This commit has the backend require the files that it expects
to already be loaded for it to work correctly.
(Maint) Remove duplication and mocking from tests

The tests used to have a large amount of duplication around setting
configuration values for Hiera, this extracts them into a common spot
and also removes some of the mocking that was being done in order to
make the tests a little more straightforward and less tied to the
implementation.
(#16178) Stop checking for :undefined

Puppet no longer returns :undefined as a special value from variable
lookups. This commit removes this extra check from the Hiera puppet
backend.
Merge pull request #1282 from zaphod42/issue/3.0.x/16178-hiera-puppet-backend-does-not-handle-false

(#16178) Handle the case where the value found is false
(#17158) clarify documentation on behavior of `replace` toward symlinks in file type

Without this patch applied the behavior of `replace` toward symlinks in the file type isn't
made explicit. This is a problem because some other parameters note differences where
symlinks are concerned, and the lack of mention of symlinks in `replace` creates a sense
of ambiguity for some users.

This patch clarifies the behavior of `replace` toward symlinks by improving the description
docstring.
(#12670) Improve the yum provider description

Without this patch applied it is unclear that the `uninstallable` feature does not also
remove dependencies when removing a package. This is a problem because users may expect
dependent packages will be removed.

This patch clarifies the behavior of the yum provider by improving the
description docstring.
(#17820) Avoid allocating and copying hashes unnecessarily

Commit 737c2f66 was implemented to ensure portability with ruby 1.8.5,
but in doing so, it caused severe performance problems, likely due to
allocating a hash, and then merging that, and returning a copy of the
merged hashes.

This commit eliminates the performance issue by not attempting to
merge the hashes, while maintaining compatibility with ruby 1.8.5.

The original code implemented in commit 7002eff7 should be restored in
3.x as that is even faster than this commit, but does not maintain
compatibility with ruby 1.8.5.

Reviewed-by: Josh Cooper <josh@puppetlabs.com>
Revert "Fix Ruby 1.8.5-incompatible code in Transaction#eval_generate"

This reverts commit 737c2f66476b2379f2546150856ea1cd7fdde08a.

The commit above was implemented to maintain compatibility with ruby
1.8.5, but resulted in a severe performance penalty ~500 times slower.
Since Puppet 3 is not compatible with ruby 1.8.5, this commit restores
the original version which is much faster.
(#7316) Restore unknown subcommand behavior

The output of puppet with an unknown subcommand changed unexpectedly. If
version arguments were specified (-V or --version), then the puppet
version was no longer displayed. If no version arguments were specified,
then the "See 'puppet help' ..." message was no longer displayed.

This commit consolidates the version and help message behavior into a
NilSubcommand, and modifies the UnknownSubcommand to extend it, thereby
preserving the behavior that existed in 3.0.x.

It also adds tests for behavior that was only partially covered in the
acceptance test `ticket_17458_puppet_command_prints_help.rb`
Merge pull request #1296 from joshcooper/ticket/master/7316-restore-unknown-subcommand

(#7316) Restore unknown subcommand behavior
(#16728) Unify handling of log coloring and prefixing

Previously the logging would omit the Notice prefix for log messages at
the notice level. This is a change from how things had worked in 2.7
where all log messages got a prefix of the log level.

This commit unifies all of the handling of log level colorization and
output by using a data-driven style and by doing so re-adds the Notice
prefix for the notice log level.
Merge branch 'ticket/2.7.x/17820-slow-eval-generate' into 2.7.x

* ticket/2.7.x/17820-slow-eval-generate:
  (#17820) Avoid allocating and copying hashes unnecessarily
Merge branch 'ticket/3.0.x/17820-slow-eval-generate' into 3.0.x

* ticket/3.0.x/17820-slow-eval-generate:
  Revert "Fix Ruby 1.8.5-incompatible code in Transaction#eval_generate"
Merge remote-tracking branch 'upstream/2.7.x' into 3.0.x

* upstream/2.7.x:
  (#17820) Avoid allocating and copying hashes unnecessarily

Conflicts:
	lib/puppet/transaction.rb
Merge remote-tracking branch 'upstream/3.0.x'

* upstream/3.0.x:
  (#16728) Unify handling of log coloring and prefixing
  Revert "Fix Ruby 1.8.5-incompatible code in Transaction#eval_generate"
  (#17820) Avoid allocating and copying hashes unnecessarily
  (#12670) Improve the yum provider description
  (#17158) clarify documentation on behavior of `replace` toward symlinks in file type
  (#16178) Stop checking for :undefined
  (Maint) Remove duplication and mocking from tests
  (Maint) Require Hiera::Backend where it is used
  (#16178) Add test for behavior of false values in lookup
  (#16178) Handle the case where temp_answer is false but defined.
Add new Ruby DSL by Mateusz Lenik.

This adds new Ruby DSL features by Mateusz Lenik.
This was developed as a Google Summer of Code project.

This commit contains all of the new Ruby DSL work in one single commit.
Whitespace and formatting cleanups

Reflow some comments and fix trailing whitespace. These were extracted from
the Ruby DSL changes in the previous commit.
Merge branch 'new-ruby-dsl-by-mlen'

* new-ruby-dsl-by-mlen:
  Whitespace and formatting cleanups
  Add new Ruby DSL by Mateusz Lenik.