maint: relax spec test of resources

The resource_spec performs some comparisons by using the equal_attributes_of
matcher. This is mostly correct, but considers some instance variables that are
of no consequence to the resource, e.g. @rstype. As a result, internal changes
to Puppet::Resource that may lead to this attribute not being set in a resource
that is generated from YAML would break this expectation:

expected
Foo::Bar[xyzzy]{:name=>"xyzzy", :one=>"test", :two=>"other"}
to equal attributes of
Foo::Bar[xyzzy]{:name=>"xyzzy", :one=>"test", :two=>"other"}

This is not only difficult to debug, it first and foremost misses the intention
of the example, which is only concerned with RAL attributes, not "internal"
instance variables.
(PUP-1381) issue warnings to current users of cron purging

A behavioral fix is planned for the 4.0 release. The final
3.x point releases should issue early warnings to users who employ
the functionality that is about to change.
(PUP-1381) make file_setting spec test more robust

A new call to self.resource_type in Puppet::Resource#initialize can cause
the loading of type code as a side effect. This interfered with the mocking
for the test

Puppet::Settings::FileSetting when being converted to a resource
should manage existent files even if 'create_files' is not enabled

Add a stubs call to one of the uncritical expectations so that
additional calls are not considered as spurious.
(PUP-1843) Restore hiera indirector terminus

This was collapsed into the DataBindings code in 9a5b81b412. That broke
community plugins using this code. This commit just restores the code
but doesn't revert the other changes from that commit.
(PUP-2298) add resource lifecycle method Puppet::Type#pre_run_check

In order to deprecate the builtin defined function (which is often abused
to work around resource duplication among modules) it is desirable to
add resource constraints to the language. An easy approach to allowing such
constraints to work is to add them as a special resource type that does not
take effect during the transaction, but fails the whole catalog in case of
validation failure.

To make this possible, add a new method #pre_run_check to the Type base class
for overriding in appropriate resource types (such as constraint).

The semantics is simply
- raise nothing if the pre-run check is succesful
- raise a Puppet::Error otherwise

The check is performed during evaluation of the transaction, just before
the catalog is applied. The generating of additional resources should be
complete when this is done (because the hook is meant to be able to
check the whole catalog for consistency).
(PUP-2298) protect transaction spec test against new exceptions

The new perform_pre_run_checks method in the transaction loops over
all resources in the catalog. This is prone to failures if any nil references
end up in the catalog. This can happen during the addition of resources
to the catalog under test conditions, because the mock resources are not
sufficiently contained.

To work around this effect, stub the very #container_of method in the mock
catalog so that all resources will have an apparent container.
(PUP-2568) Downcase class name before validating

Previously the check for a valid name was done against the raw input,
however it later downcased the name and used that form. This order
caused Class['A'] to be an error, which isn't desired (at least not
until PUP-1810 is taken care of). By just changing the order of
operations capital letters are once again allowed.
(PUP-2581) Make illegal names interchangeable to legal variable work

In interpolation when using expression mode ${} and having an illegal
name (e.g. _x) that resulted in a syntax error as the _x got translated
to a STRING token (a bare word not being a name). The interpolation
logic could then not transform it into a (valid) variable expression
(i.e. $_x).

The change is to let the lexer emit a WORD token for the illegal NAME.
The interpolation then changes that to a VARIBLE if it is the only
expression. If the WORD token escapes into the grammar, it is equivalent
to having used a quoted string in the source text.

Note that WORD only accepts unqualified input, anything with a : that is
not a valid NAME is still flagged as an error. Thus _x::y, x::_y are
both illegal NAME.
(PUP-2519) Use File::PATH_SEPARATOR for environmentpath spec

One of the new specs testing the creation of production directory
environment in the settings catalog was using a ':' instead of
File::PATH_SEPARATOR and therefor failing on Windows.  This commit
changes it to use File::PATH_SEPARATOR.
(maint) Reorder code to increase clarity

There were a lot of unless cases that made it hard for me to track down
the path of what was actually accepted. This inverts the branches so
that the if statements lay out what is required for the good case and
the else clauses express the various failures.

In addition there were a few error scenarios where reordering was
possible and reduced the amount of work that needed to be done before
the error was detected.
(PUP-2568) Remove unnecessary calls

There are several calls that can be removed from various paths. Downcase
isn't needed for the PResourceType's type_name, since that is already
downcased (removes a string copy). The other change is that the NAME
pattern can handle leading :: and so that only needs to be stripped off
if it is a valid name (removes a string copy).
Merge branch 'pr/2656' into stable

* pr/2656:
  (PUP-2568) Remove unnecessary calls
  (maint) Reorder code to increase clarity
  (PUP-2568) Downcase class name before validating

Closes GH-2656
Merge pull request #2661 from hlindberg/pup-2581_interpolating-expression-of-bad-name

(PUP-2581) Make illegal names interchangeable to legal variable in interpolation
Merge remote-tracking branch 'upstream/stable'

* upstream/stable:
  (PUP-2568) Remove unnecessary calls
  (maint) Reorder code to increase clarity
  (PUP-2581) Make illegal names interchangeable to legal variable work
  (PUP-2568) Downcase class name before validating

Conflicts:
	lib/puppet/pops/parser/eparser.rb

Rebuilt eparser.
(PUP-2610) Maintain context during application exit

Because of the way rack servers get configured by puppet, the
application system needs to maintain any context information that is
setup while starting even after the application has exited. This is
because the rack app is created by calling the "master" application and
using the return value (which threads all the way back through the
application and command line layers) as the rack app. When the contexts
were removed on the way out of the application they also removed the
setup for how environments were loaded.

This also required that there be a way of undoing a series of context
pushes without knowing how many had been done. For this there is now a
mark and rollback capability in the Puppet::Context system. This is used
in the tests to always return to the context that was present at the
start of every test.
(PUP-1807) Change empty string to be "truthy"

An empty string is now interpreted as a "true" value. It used to
represent a false value.

This representation is only in the future evaluator. Values are still
transformed when calling the 3x function API (it expect undef to be
encoded as empty string). This also takes place when transforming to the
3x catalog.
(PUP-1807) Add tests cases for undef equality checks

This adds checks that future evaluator treats '' != undef.
(It already did this, but tests were missing).
(maint) Remove commented out code
(PUP-1894) Fix issue with loading EPP from modules

The problem when loading EPP was that the name of the environment was
passed instead of the actual environment (which was expected).
This simply changes this, and adds a test that an epp can be loaded from
a module.
Merge pull request #2664 from zaphod42/issue/stable/pup-2610-rack-fails-to-track-environments

(PUP-2610) Maintain context during application exit