This PR adds the concept of "exhaustiveness" to layers contracts. An exhaustive contract is one where the contract definition is guaranteed to specify all layers that may exist in the containing modules. Users can also ignore submodules from the exhaustiveness checks if that flexibility is needed.
The aim of exhaustive contracts is to make it impossible to add a new layer into a container without considering where it fits in the hierachy.
The PR contains various bits of housekeeping that I did while trying to get a clean tox run on my local machine - I can drop them if preferred.
This PR adds the concept of "exhaustiveness" to layers contracts. An exhaustive contract is one where the contract definition is guaranteed to specify all layers that may exist in the containing modules. Users can also ignore submodules from the exhaustiveness checks if that flexibility is needed.
The aim of exhaustive contracts is to make it impossible to add a new layer into a container without considering where it fits in the hierachy.
The PR contains various bits of housekeeping that I did while trying to get a clean
tox
run on my local machine - I can drop them if preferred.