(docs) Note that the path setting only works in main section of puppet.conf

See PUP-3023 for more info.
(maint) Remove GC bug workaround for Ruby < 1.8.7

Commit bd5dc649 added a workaround for a Ruby GC bug that was present in
1.8.5, 1.8.6, and partially fixed but still residual in 1.8.7. Since
we're dropping Ruby 1.8 support entirely we can now remove the
workarounds.
(PUP-1106) Unschedule refreshes on skipped resources

If a given resource is being skipped (e.g. has failed dependencies, is
unscheduled, untagged, etc) that resource should not trigger any
additional behavior. However a resource could be skipped and still have
events trigger behavior. This commit changes the event processing logic
to only process events for resources that should be applied and dequeues
events on resources that should not be applied.
(maint) Use correct data type when unscheduling events

Commit 9d59f204 added the ability to dequeue events on a given resource,
but it did so by setting the value of the target callbacks to an empty
hash. However the value of target callbacks is an array, so if events
were re-queued for a given resource we would get an error like so:

    {}.concat(%w{one two three})
    NoMethodError: undefined method `concat' for {}:Hash

Currently we can't requeue events after dequeuing events, but if this
changes then this code is very incorrect.

This commit fixes the event reset to behave as expected.
(PUP-3312) Remove deprecated methods from the Puppet module

This commit removes the `parse_config` and
`initialize_settings_for_run_mode` class methods from the Puppet
module. This commit is part of the code removal effort for Puppet 4.
(PUP-3569) Do not require rubygems in Rakefile for modules
(maint) Pull apart test for reuse

The cache expiration service test had some useful parts in it that will
be useful for another test later. This pulls it apart so that those
pieces are available and also is a little refactoring so that I can
become familiar with how it was working.
(PUP-2733) Refactor binder's use of Puppetx

This refactors the binder's use of Puppetx. The problem with the
previous implementation was that it squatted on the Puppetx namespace in
a way that made it difficult to use for its original purpose.

This commit changes the organization. The extension points that define
how puppet can be extended are in Puppet:Spi namespaced modules. One
module per extension. Each such extension specifies the type and the
symbols to use when binding services.

A Puppet::Spi::Configuration is responsible for configuring/wiring
the service programming interface(s) by registering them for inclusion
in the binder(s) being set up.

The only currently existing implementation of a default service is
the Json syntax checker - it has also moved out from the Puppetx
namespace and is now found in Puppet::SyntaxCheckers::Json.
(PUP-2733) Rename puppet::spi to puppet::plugins
(PUP-2733) Cleanup names that contained SPI and touch up comments
(PUP-3635) Add scanf function

This adds a scanf function that is useful when converting from a string
to other data types.
(PUP-3293) Remove deprecated and unused pson and rubygems features

This commit removes the deprecated `features.pson?` and `features.rubygems?`
features.
(PUP-3568) Use puppet-lint v1 in module skeleton

The relative bit is necessary with puppet-lint v1 or it will fail if the
directory is not named correctly, which anyone doing development is
going to have. After I upgraded to puppet-lint v1, all of my travis-ci
builds started to fail and this is the fix.

These are all common situations that would fail

* Using Travis-ci.org

* `puppet module generate ghoneycutt-foo && cd ghoneycutt-foo && \
  rake lint`

* `git clone https://github.com/ghoneycutt/puppet-module-dnsclient.git \
  && cd puppet-module-dnsclient && rake lint`
(maint) Unify many directory structures for test

The previous tests used a lot of different structures and set them up
individually. This was nice in that each test was self contained, but it
also left a lot of noise in some tests that only cared that *any*
environment simply exists, and the exact form of the environments wasn't
important. This unifies all of those cases so that there is a reusable
"basic" environment available.
(PUP-3621) Ensure that get! caches

The introduction of get! caused any users of that method to circumvent
the cache. This happened because, rather than delegating to get() and
raising an error, it implemented similar logic to get(), but only from
the common base class. This caused it to skip all caching checks. This
adds caching back in and adds tests for that behavior.
(maint) Remove inheritance to make mistakes less likely

The previous mistake happened partly because the classes were written
with inheritance rather than delegation. The inheritance caused the
Combined#get! implementation to be used, which was appropriate for it,
but not for the Cached get. The Cached implementation also has no reason
to allow multiple loaders, instead it only needs a single loader and
multiple ones can be put together using the Combined loader. This change
makes that distinction much clearer.
(PUP-2906) Reimplement collection evaluation

Since collection currently relies on the 3x AST, it must be
reimplemented in such a way that it does not rely on the old parser.
That way, we won't break collection with the old parser is removed
for the 4x series.

Take the first steps towards doing this by reimplementing evaluation
for collections so that it no longer relies on
Puppet::Parser::AST::Collection or Puppet::Parser::AST::CollExpr.

Additionally, make a small change to resource/file/content.rb so
that it uses dup instead of clone. This is necessary to prevent
trying to modify a frozen String.
(PUP-2906) Refactor collector into several classes

Prior to this commit, the parser created a Puppet::Parser::Collector
in order to collect resources. However, there were three distinct
code paths that needed to be dealt with: collection of virtual
resources, collection of exported resources, and realization of
a set of resources.

In order to make the code for collection more readable and manageable,
split up the current collector into three different collectors which
reflect the code paths described above.

Additionally, make some changes to the compiler so that it is compatible
with these new collectors while still supporting the old 3x collector.
(PUP-2906) Add benchmark for collection

In order to ensure that we don't make collection any slower, add
a benchmark which tests how long it takes to create 200 resources
and collect them.
(PUP-2906) Optimize and clean up code

Use the benchmark to track down and fix some code that could be
optimized to make collection faster. Additionally clean up the
code for collectors and add some YARD documentation for the API.