Separated dictionary metadata management
Use the ModelObject base class
More to_dict() updates; renamed dimension parent to master (as in "master/clone")
Renamed dimension's limited_clone() to clone(); included nonadditive properties
Refactored requirement of dimension attribute: removed from level and hierarchy, only attributes should reference it; make sure that hierarchy receives levels as objects not as strings; added tests
Added expand_cube_metadata() and expand_dimension_links()
Fixed import of relocated metadata functions
Introduced dimension_links; Dimension.clone() now accepts non additive, default_hierarchy and cardinality besides hierarchies;
[backends] reflect model construction changes
Be graceful and expand the dimension links in Cube.__init__() – don't require backends to do that.
Backward compatible cube.hierarchies → cube.dimensions
Removed cube.hierarchies; documented cube.dimension_links; don't raise exception when there are multiple hierarchies and no default, just use the first one (we are no longer using dicts, we know which one is the first one)
Moved cube-dimension linking into Cube
Improved hierarchy assignment; added linking tests
Removed test log noise
Added `alias` to dimension linking/cloning – no need to create another dimension if the whole structure is shared as-is.
Updated the cube definition documentation
Updated model doc + added release notes
Inherit non additive by measures; added test; corrected SQL fact test
Added "exclude_hierarchies" to the cube-dim link (will be used only in manually crafted models)