to_dict() method of model objects now has a flag create_label which
provides label attribute derived from the object’s name, if label is missing

#95: Allow charset to be specified in Content-Type header

SQL:

added option to SQL workspace/browser safe_labels to use safe column
labels for databases that do not support characters like . in column names
even when quoted (advanced feature, does not work with denormalization)

browser accepts include_cell_count and include_summary arguments to
optionally disable/enable inclusion of respective results in the aggregation
result object

added implicit ordering by levels to aggregate and dimension values methods
(for list of facts it is not yet decided how this should work)

#97: partially implemented sort_key, available in aggregate() and
values() methods

To address issue #8 create_model(dict) was added as replacement for
Model(dict). Model() from now on will expect correctly constructed model
objects. create_model() will be able to handle various simplifications and
defaults during the construction process.

added info attribute to all model objects. It can be used to store custom,
application or front-end specific information

AggregationResult.table_rows() - new method that iterates through
drill-down rows and returns a tuple with key, label, path, and rest of the
fields.

dimension in model description can specify another template dimension – all
properties from the template will be inherited in the new dimension. All
dimension properties specified in the new dimension completely override the
template specification

added point_cut_for_dimension

added simple_model(cube_name, dimensions, measures) – creates a single-cube
model with flat dimensions from a list of dimension names and measures from
a list of measure names. For example:

creation of a model from dictionary through Model(dict) is depreciated, use
create_model(dict) instead. All initialization code will be moved there.
Depreciation warnings were added. Old functionality retained for the time
being. (important)

Replaced Attribute.full_name() with Attribute.ref()

Removed Dimension.attribute_reference() as same can be achieved with
dim(attr).ref()

AggregationResult.drilldown renamed to AggregationResults.cells

Planned Changes:

str(Attribute) will return ref() instead of attribute name as it is more
useful

cut_from_string(): added parsing of range and set cuts from string;
introduced requirement for key format: Keys should now have format
“alphanumeric character or underscore” if they are going to be converted to
strings (for example when using slicer HTTP server)

all /report JSON requests should now have queries wrapped in the key
queries. This was originally intended way of use, but was not correctly
implemented. A descriptive error message is returned from the server if the
key queries is not present. Despite being rather a bug-fix, it is listed
here as it requires your attention for possible change of your code.

Slicer: Change all your slicer.ini configuration files to have
[workspace] section instead of old [db] or [backend]. Depreciation
warning is issued, will work if not changed.

Model: Change dimensions in model to be an array instead of a
dictionary. Same with cubes. Old style: "dimensions"={"date"=...}
new style: "dimensions"=[{"name":"date",...}]. Will work if not
changed, just be prepared.

Python: Use Dimension.hierarchy() instead of Dimension.default_hierarchy.

slicer_context() - new method that holds all relevant information from
configuration. can be reused when creating tools that work in connected
database environment

added Hierarchy.all_attributes() and .key_attributes()

Cell.rollup_dim() - rolls up single dimension to a specified level. this might
later replace the Cell.rollup() method

Cell.drilldown() - drills down the cell

create_workspace() - new top-level method for creating a workspace by name
of a backend and a configuration dictionary. Easier to create browsers (from
possible browser pool) programmatically. The browser name might be full
module name path or relative to the cubes.backends, for example
sql.browser for default SQL denormalized browser.

Slicer version should be same version as Cubes: Original intention was to
have separate server, therefore it had its own versioning. Now there is no
reason for separate version, moreover it can introduce confusion.

Class ‘Cuboid’ was renamed to more correct ‘Cell’. ‘Cuboid’ is a part of
cube with subset of dimensions.

all APIs with ‘cuboid’ in their name/arguments were renamed to use ‘cell’
instead

Changed initialization of model classes: Model, Cube, Dimension, Hierarchy,
Level to be more “pythony”: instead of using initialization dictionary, each
attribute is listed as parameter, rest is handled from variable list of key
word arguments

Improved handling of flat and detail-less dimensions (dimensions represented
just by one attribute which is also a key)

Model Initialization Defaults:

If no levels are specified during initialization, then dimension name is
considered flat, with single attribute.

If no hierarchy is specified and levels are specified, then default
hierarchy will be created from order of levels

If no levels are specified, then one level is created, with name default
and dimension will be considered flat

Note: This initialization defaults might be moved into a separate utility
function/class that will populate incomplete model