Created an oauth2 package which encapsulates all oauth2 providers,
utility functions, types, and interfaces. Previously some methods of the
Github provider were used as http.HandlerFuncs. These have now been
pulled into a concrete type called a JWTMux to implement other Oauth2
providers.
JWTMux has all of the functionality required to take a token from any
provider and store it as a JWT in a browser, and that is the extent of
its responsibilities. It implements the oauth2.Mux interface which would
potentially allow other strategies of oauth2 credential storage.
Open() wasn't a hard requirement, so it was a little surprising to need
to use it when creating an enterprise.Client in some circumstances but
not others. This returns an error when Querying if Open() was not
called, preventing panics which would otherwise result. Granted, this
would only be encountered by developers, but I believe a helpful error
is sometimes more useful than a mysterious panic when making libs that
devs actually enjoy using. Furthermore, a preflight check to see whether
dataNodes was initialized makes the Open() method idempotent.
This divides templates into two classes: autoflow and static. This is
controlled by a boolean "autoflow" property on templates. Any autoflow
templates that will be rendered for a host, have their cells arranged in
a left-to-right, top-to-bottom fashion.
Static templates, are assumed to have precise positioning information
for their graphs. The only adjustment made to them will be a translation
of their Y coords so they do not overlap other layouts.
The autoflow templates, after processing, become a static layout as
defined above and are positioned accordingly.