So this allows people to alter the APIs for their plugins and allows
plugins to verify the API is compatible with the one they expect.
It adds a version property to Plugin classes, and has a SemVer checking
method which can be called from other plugins to verify a plugin against
a particular version.
This removes the assertions that checked plugin devs didn't do anything
overly bad in favour of using mypy to ensure appropriate type-checking.
It also moves the ProgressCallback typing information to constants in
order to avoid circular imports (since constants doesn't import
anything).
Relented on the strict import of direct objects/classes for the typing
module only. Typing module components can be directly imported because
it makes the code really painful to read and write otherwise.
This is still in-line with the python style guide adopted from Google at
http://google.github.io/styleguide/pyguide.html section 2.2.
This also adds support for manually constructed configurables to
populate the config tree in the current context.
I'm still toying around with this though, I need to figure out
what to do with optional values and think the whole thing through
to make sure it's worthwhile.
So this is where I ripped out the guts of the dependency tree
and made it a little better defined in some ways, and delayed
populating it in others. The validate function signature has
changed and I'm still up in the air whether to validate with
True/False or throw/catch exceptions.
So now, configurables have a list of requirements, these are
then bundled into a single requirement and can be passed to
automagic. Automagic runs a set of things over the deptree
to help build/manage it. These run in order of priority.
The tree is still built from the top down, but now automagic
can build branch from the bottom up and try and splice them
into the tree where appropriate. Hopefully this will make it
easier to see follow.