(#14296) Improve template function error message.

The current template function does not provide sufficient detail for
troubleshooting. This patch uses the backtrace to provide the fully
qualified filepath and line number.

Previous error message:
Failed to parse template test/example.erb: undefined method `[]' for
nil:NilClass at /tmp/module/test/manifests/init.pp:2 on node example

New error message:
Failed to parse template test/example.erb:
  Filepath: /tmp/module/test/templates/example.erb
  Line: 10
  Detail: undefined method `[]' for nil:NilClass
 at /tmp/module/test/manifests/init.pp:2 on node example
Significantly improve compilation performance when using modules

When autoloading classes/defines, the typeloader constructs a set of
possible locations for the class, based on its name. Effectively, it
will look in the canonical locations corresponding to each namespace in
the fully-qualified name. So for each namespace, it will ask the
environment for a Puppet::Module instance for that module, to ask it
which of the module's potentially manifests match the class it's looking
for. To answer that request, the environment instantiates a
Puppet::Module.

This amounts to potentially thousands of Puppet::Module instances being
created, because it does this many times (based on nesting of the class
name) per include/autoload/import. When Puppet::Module instances are
created, they parse and load their metadata.json file, in part to
validate their use. This implies that each compilation results in
metadata.json being parsed thousands of times, which is extremely slow
(and obviously provides no actual benefit).

Fortunately, the environment object already keeps a list of
Puppet::Module instances for every module in its modulepath. The fix
applied here is simply to change the environment such that it provides
modules by looking them up in its cached list, resulting in up to an
order of magnitude improvement in compilation time.
maint: use relative paths to fixtures.

We used to return absolute paths to fixtures, rather than relative paths.

This made the test output uglier than it needed to be; we may as well do the
extra work to make them relative.

Signed-off-by: Daniel Pittman <daniel@puppetlabs.com>
(#10146) `-` is not legal in variable names.

When a bunch of refactoring went on to clean up the grammer and lexer, the `-`
character became a legal character in variable names.  This was not entirely
desired - and contravenes our existing rules for naming.

This adds testing for legal variable names, then applies that across the lexer
to ensure that legal names pass, and illegal names fail.

Signed-off-by: Daniel Pittman <daniel@puppetlabs.com>
Fix broken man page rake task

The mass static man page generator was broken! Something changed in commit
82e5fa9561e2d4cb1d699a41c14f50953d8f2d97 which broke the way we were passing
render_as to the man action; while that bears further investigation, we were
able to get the task working again by simply removing it, since the value we
were passing to option turned out to be redundant when using the action from
the API.

We also found that I had unwisely called the argument of the save action for
indirector faces "<object>", which Ronn confuses for an HTML tag of the same
name and then barfs on. This commit fixes that, too.
Merge pull request #758 from nfagerlund/maint/2.7.x/fix_man_pages

Fix broken man page rake task
Merge pull request #757 from daniel-pittman/bug/2.7.x/10146-don't-allow-dash-in-variables

Bug/2.7.x/10146 don't allow dash in variables
(#14440) Hack to allow help faces to be used as API

Because we have not done a good job of defining
state initialization life cycle when we try to use
puppet as API, we need to add a hack to the rake
manpage task so that it can generate man pages
for some faces that don't get properly initialized
w/o the hack.
Revert "maint: use relative paths to fixtures."

This reverts commit 7ce9e17cf1077604accc1a5cfe90ad7b1bb99a55.
The change to using Pathname in fixtures is not compatible with Windows.
Maint: De-genericize Puppet Forge references in module face

The module tool supports a private Forge right now, but only if you have THE
Forge -- the APIs are not public yet, and are still subject to change as we
build out new features. This commit changes the help text so that it doesn't
imply private repos to be an immediately viable thing.
Merge pull request #738 from nanliu/ticket/2.7.x/14296

(#14296) Improve template function error message.
Merge pull request #753 from nicklewis/type-loader-performance

Significantly improve compilation performance when using modules
Merge pull request #763 from cprice-puppet/bug/2.7.x/help-faces-as-api

Bug/2.7.x/14440-rake-manpages
Fix unit test failure in fileserver due to modules

This test is setting modulepath, and then testing that it can find
modules from the modulepath. However, the recent change to module find
causing it to read from the cached list of modules requires the cache be
cleared after changing the modulepath in order for the modules to be
found.

Also, the structure of the test changed a bit because we have to put the
modules on disk, THEN refresh the cache, THEN we can find them, rather
than putting them on disk and immediately finding them.
Merge pull request #768 from nicklewis/fix-fileserver-test-failure

Fix unit test failure in fileserver due to modules
Merge pull request #765 from nfagerlund/maint/2.7.x/no-private-forges

Maint/2.7.x/no private forges
(#14424) Expand path of the target directory

This patch expands the path of the target installation directory and
will prevent the following errors:

    Error: undefined method `each' for nil:NilClass
Merge pull request #756 from kelseyhightower/ticket/2.7.x/14424_expand_path_of_target_directory

(#14424) Expand path of the target directory
Use absolute_path in module install spec

This fixes the module install spec on windows
Merge pull request #777 from pcarlisle/maint/2.7.x/fix_module_install_specs

Use absolute_path in module install spec