bronx.stdtypes.tracking

Tools to handle changes in some context.

Changes could be creation, deletion, modification.

Classes

class bronx.stdtypes.tracking.MappingTracker(before, after)[source]

Bases: Tracker

A tracker that compute the differences between two mappings (e.g. dictionaries).

Parameters:
  • before (collections.abc.Mapping) – The reference mapping

  • after (collections.abc.Mapping) – The (possibly) modified mapping

On the contrary to the Tracker class, the deleted, created, updated and unchanged properties are read-only.

Example:

>>> a=dict(a=1, b=2, c=3)
>>> b=dict(b=9, c=3, d=4)
>>> mtracker=MappingTracker(a, b)
>>> mtracker.dump()
Item deleted: a
Item created: d
Item updated: b
Item unchanged: c
>>> mtracker.differences()
Item deleted: a
Item created: d
Item updated: b
>>> len(mtracker)
3
>>> sorted(mtracker)
['a', 'b', 'c', 'd']
>>> 'c' in mtracker
True
property created

The set of created items.

property deleted

The set of deleted items.

property unchanged

The set of unchanged items.

property updated

The set of updated items.

class bronx.stdtypes.tracking.RecursiveMappingTracker(before, after)[source]

Bases: MappingTracker

A tracker that compute that recursively compute differences between two mappings (e.g. dictionaries).

Parameters:
  • before (collections.abc.Mapping) – The reference mapping

  • after (collections.abc.Mapping) – The (possibly) modified mapping

On the contrary to the Tracker class, the deleted, created, updated and unchanged properties are read-only.

Example:

>>> a = dict(a=1, b=dict(b1=1, b2=2, b3={1, 2}), c=0)
>>> b = dict(a=1, b=dict(b1=1, b2=3, b3={1, 3}, b4='x'), d=0)
>>> mtracker=RecursiveMappingTracker(a, b)
>>> mtracker.dump_legend()
(legend: created: "+"  deleted: "-"  unchanged: "="  updated: "?")
>>> mtracker.differences()
- c: 0
+ d: 0
? b:
  | + b4: 'x'
  | ? b2: before=2 after=3
  | ? b3:
  |   | Set's item deleted: 2
  |   | Set's item created: 3
>>> mtracker.deleted_data == {'c': 0}
True
>>> mtracker.created_data == {'d': 0}
True
>>> mtracker.unchanged_data == {'a': 1}
True
>>> set(mtracker.updated_data.keys()) == {'b'}
True

The updated_data one and only item (b) is itself a RecursiveMappingTracker object:

>>> mtracker.updated_data['b'].dump()
+ b4: 'x'
= b1: 1
? b2: before=2 after=3
? b3:
  | Set's item deleted: 2
  | Set's item created: 3
property created_data

A mapping of created items (present in after but not in before).

property deleted_data

A mapping of deleteted items (present in before but not in after).

dump(*args)[source]

Produce a simple dump report.

dump_legend()[source]

The “legend” of the result of a dump() call.

dump_str(*args, **kwargs)[source]

Produce a simple report string.

property unchanged_data

A mapping of items available and identical in both before and after.

property updated_data

A mapping of items available in both before and after but with different values.

bronx.stdtypes.tracking.SimpleDifference

alias of SimpleDiffernce

class bronx.stdtypes.tracking.Tracker(before=None, after=None, deleted=None, created=None, updated=None, unchanged=None, sectionlabel='Section')[source]

Bases: object

Handling of simple state status through deleted, created or updated items.

Parameters:
  • before (collections.abc.Iterable) – The reference list of items

  • after (collections.abc.Iterable) – The possibly modified list of items

  • deleted (collections.abc.Iterable) – The list of deleted items

  • created (collections.abc.Iterable) – The list of created items

  • updated (collections.abc.Iterable) – The list of updated items

  • unchanged (collections.abc.Iterable) – The list of unchanged items

  • sectionlabel – The display name of items

There are two way to initialise such an object:

  • Using the after and before attributes. Doing so, the deleted, created and unchanged sets are automatically computed;

  • Using the deleted, created and unchanged attributes in order to setup manually those items.

Example using after and before:

>>> a=[1,2,3,4,5,6]
>>> b=[1,2,4,6,7]
>>> tracker=Tracker(before=a, after=b)
>>> tracker.dump()   
Section deleted: 3, 5
Section created: 7
Section updated:
Section unchanged: 1, 2, 4, 6
>>> tracker.differences()   
Section deleted: 3, 5
Section created: 7
>>> list(tracker)
[1, 2, 3, 4, 5, 6, 7]
>>> tracker.updated = [2, 4]
>>> tracker.dump()
Section deleted: 3, 5
Section created: 7
Section updated: 2, 4
Section unchanged: 1, 6

Example using deleted, created and unchanged:

>>> trackbis=Tracker(deleted=[1, 2], created=[3, 4], unchanged=[5, 6], updated=[7, 8])
>>> trackbis.dump()
Section deleted: 1, 2
Section created: 3, 4
Section updated: 8, 7
Section unchanged: 5, 6
>>> trackbis.unchanged = [7, ]
>>> trackbis.dump()
Section deleted: 1, 2
Section created: 3, 4
Section updated: 8
Section unchanged: 7
property created

The set of created items.

property deleted

The set of deleted items.

differences()[source]

Dump only created, deleted and updated items.

dump(*args)[source]

Produce a simple dump report.

dump_str(*args, **kwargs)[source]

Produce a simple report string.

property unchanged

The set of unchanged items.

property updated

The set of updated items.