=================================================================================================
+ FEAT(modifier): Dependencies with :term:`json pointer path` that can read/write
:term:`subdoc`\s (e.g. nested dicts & pandas).
+ feat(config): added :func:`set_layered_solution()` into :term:`configurations`
which when True (or *jsonps* in the network if None (default)) all results
are stored in the given inputs to the pipeline
(this may become the regular behavior in the future).
+ feat(modifier, solution): +modifier with accessor functions to read/write Solution.
+ doc: new section :ref:`hierarchical-data` putting together all advanced features
of the project in a "Weekly task runner".
+ BREAK/REFACT: modules and objects renamed:
+---------------------------------+-----------------------------+
| FROM | TO |
+=================================+=============================+
| :file:`modifierS.py` | :file:`modifier.py` |
+---------------------------------+-----------------------------+
| func: modifiers.fn_kwarg | :func:`.modifier.keyword()` |
+---------------------------------+-----------------------------+
| :file:`network.py` | :file:`planning.py` |
+---------------------------------+-----------------------------+
| :file:`op.py` | :file:`fnop.py` |
+---------------------------------+-----------------------------+
| class: op.FunctionalOperation | :class:`.fnop.FnOp` |
+---------------------------------+-----------------------------+
+ FEAT(op): default :func:`.identity_function()` acting as :term:`conveyor operation`.
+ FIX(NET, EXECUTION): discovered and fixed bugs in pruning, evictions and rescheduling
with overwrites, while testing new `jsonp` modifier; rely on dag alone while pruning
(and not digging into op needs/provides).
- Dupe Evictions of pruned output were deliberately & wrongly consolidated, while
it is possible to need to evict repeatedly the same out from multiple ops
providing it.
- Less aggressive prune-isolated-data permits SFX not to be asked explicitly,
and behave more like regular data.
Now For certain cases, the more specific error "Unreachable out" gets raised,
instead of the too generic "Unsolvable graph".
- Prune-by-outputs was ignoring given inputs, chocking on computation cycles
that were possible to avoid!
+ DROP(net): ``_EvictionInstruction`` class was obscuring modifier combinations, and
it didn't make sense any more, being the only instruction.
+ FEAT(ops, pipelines, net, sol): unified :meth:`.Plottable.ops` utility properties.
+ ENH: Error reporting:
+ enh(op, pipe): fail earlier if no function/name given when defining operations
and pipelines.
+ enh(op): when :envvar:`GRAPHTIK_DEBUG` var defined, any errors during inputs/needs
matching are raised immediately.
+ enh: improve tips & hints in exception messages; log past executed operations
when a pipeline fails.
+ DOC(op): table explaining the differences between various dependency attributes of
:class:`.FnOp`.
.. include:: ../../graphtik/fnop.py
:start-after: .. dep-attributes-start
:end-before: .. dep-attributes-end
+ enh(op, pipe): restrict operation names to be strings (were :class:`collection.abc.Hashable`).
+ feat(modifier): public-ize :func:`modifier_withset()` to produce modified
clones -- handle it with care.
+ feat(doc): Add new section with most significant :ref:`features` of this project.
+ fix(travis): update `pytest` or else `pip-install chokes with
<https://travis-ci.org/github/ankostis/graphkit/jobs/700326904>`_ `pytest-coverage` plugin.
+ enh(pytest): add ``--logger-disabled`` CLI option when running TCs, as explained
in `pytest-dev/pytest7431 <https://github.com/pytest-dev/pytest/issues/7431>`_.
+ refact(tests): split big :file:`test/test_graphtik.py` TC file into multiple
ones, per functionality area (features).