Package: node
NodeOverviewNode is a library to create nested data models and structures.These data models are described as trees of nodes, optionally with attributes
and schema definitions.They utilize:Python’smapping and sequence API’sfor accessing node members.The contract ofzope.location.interfaces.ILocationfor hierarchy information.One purpose of this package is to provide a unified API to different backend
storages. Specific storage related implementations are for example:node.ext.fsnode.ext.ldapnode.ext.yamlnode.ext.zodbAnother usecase is providing interfaces for specific application domains.E.g. for user and group management,node.ext.ugmdefines the interfaces.
Additional it implements a file based default implementation. Then there are
specific implementations of those interfaces innode.ext.ldapandcone.sql, to access users and groups in
LDAP and SQL databases.This package is also used to build in-memory models of all sorts.E.g.yafowilis a HTML form processing
and rendering library. It uses node trees for declarative description of the
form model.Another one to mention iscone.app,
aPyramidbased development environment
for web applications, which uses node trees to describe the application model.Basic UsageThere are two basic node types. Mapping nodes and sequence nodes. This
package provides some basic nodes to start from.Mapping NodesMapping nodes implementnode.interfaces.IMappingNode. A mapping in python
is a container object that supports arbitrary key lookups and implements the
methods specified in theMutableMappingof pythons abstract base classes
respectivezope.interface.common.mapping.IFullMapping.An unordered node. This can be used as base for trees where order of items
doesn’t matter:fromnode.baseimportBaseNoderoot=BaseNode(name='root')root['child']=BaseNode()An ordered node. The order of items is preserved:fromnode.baseimportOrderedNoderoot=OrderedNode(name='orderedroot')root['foo']=OrderedNode()root['bar']=OrderedNode()Withprinttreewe can do a quick inspection of our node tree:>>>root.printtree()<class 'node.base.OrderedNode'>: orderedroot
  <class 'node.base.OrderedNode'>: foo
  <class 'node.base.OrderedNode'>: barSequence NodesSequence nodes implementnode.interfaces.ISequenceNode. In the context
of this library, a sequence is an implementation of the methods
specified in theMutableSequenceof pythons abstract base classes respectivezope.interface.common.collections.IMutableSequence.Using a list node:fromnode.baseimportBaseNodefromnode.baseimportListNoderoot=ListNode(name='listroot')root.insert(0,BaseNode())root.insert(1,BaseNode())Check tree structure withprinttree:>>>root.printtree()<class 'node.base.ListNode'>: listnode
  <class 'node.base.BaseNode'>: 0
  <class 'node.base.BaseNode'>: 1NoteSequence nodes are introduced as of node 1.0 and are not as feature rich
as mapping nodes (yet). If you find inconsistencies or missing features,
please file an issue or create a pull request at github.Behaviorsnodeutilizes theplumberpackage.The different functionalities of nodes are provided as plumbing behaviors:fromnode.behaviorsimportDefaultInitfromnode.behaviorsimportMappingNodefromnode.behaviorsimportOdictStoragefromplumberimportplumbing@plumbing(DefaultInit,MappingNode,OdictStorage)classCustomNode:passWhen inspecting theCustomNodeclass, we can see it was plumbed using given
behaviors, now representing a complete node implementation:>>>dir(CustomNode)['__bool__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__implemented__',
'__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
'__module__', '__name__', '__ne__', '__new__', '__nonzero__', '__parent__',
'__plumbing__', '__plumbing_stacks__', '__provides__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__',
'__str__', '__subclasshook__', '__weakref__', 'acquire', 'clear', 'copy',
'deepcopy', 'detach', 'filtereditems', 'filtereditervalues', 'filteredvalues',
'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys',
'name', 'noderepr', 'parent', 'path', 'pop', 'popitem', 'printtree', 'root',
'setdefault', 'storage', 'treerepr', 'update', 'values']Please read the documentation ofplumberfor detailed information about the
plumbing system.AttributesWhile it is not strictly necessary, it’s a good idea to separate the
hierarchical structure of a model from the node related attributes to avoid
naming conflicts. Attributes are provided vianode.behaviors.Attributesplumbing behavior:fromnode.behaviorsimportAttributesfromnode.behaviorsimportDefaultInitfromnode.behaviorsimportDictStoragefromnode.behaviorsimportMappingNodefromplumberimportplumbing@plumbing(Attributes,DefaultInit,MappingNode,DictStorage)classNodeWithAttributes:passThe node now provides anattrsattribute. Node attributes are itself just
a node:>>>node=NodeWithAttributes()>>>attrs=node.attrs>>>attrs<NodeAttributes object 'None' at ...>>>>attrs['foo']='foo'If it’s desired to access attribute members via python attribute access,attribute_access_for_attrsmust be set on node:>>>node.attribute_access_for_attrs=True>>>attrs=node.attrs>>>attrs.foo='bar'>>>attrs.foo'bar'A custom attributes implementation can be set by definingattributes_factoryon the node:fromnode.behaviorsimportNodeAttributesclassCustomAttributes(NodeAttributes):passclassCustomAttributesNode(NodeWithAttributes):attributes_factory=CustomAttributesThis factory is then used to instantiate the attributes:>>>node=CustomAttributesNode()>>>node.attrs<CustomAttributes object 'None' at ...>SchemaTo describe the data types of node members, this package provides a mechanism
for defining schemata.This can happen in different ways. One is to define the schema for node members
directly. This is useful for nodes representing a leaf in the hierarchy or for
node attribute nodes:fromnodeimportschemafromnode.baseimportBaseNodefromnode.behaviorsimportDefaultInitfromnode.behaviorsimportDictStoragefromnode.behaviorsimportMappingNodefromnode.behaviorsimportSchemafromplumberimportplumbing@plumbing(DefaultInit,MappingNode,DictStorage,Schema)classSchemaNode:schema={'int':schema.Int(),'float':schema.Float(default=1.),'str':schema.Str(),'bool':schema.Bool(default=False),'node':schema.Node(BaseNode)}Children defined in the schema provide a default value. If not explicitely
defined, the default value is alwaysnode.utils.UNSET:>>>node=SchemaNode()>>>node['int']<UNSET>>>>node['float']1.0>>>node['bool']FalseChildren defined in the schema are validated against the defined type when
setting it’s value:>>>node=SchemaNode()>>>node['int']='A'Traceback (most recent call last):...ValueError:A is no <class 'int'> typeFor accessing members defined in the schema as node attributes,SchemaAsAttributesplumbing behavior can be used:fromnode.behaviorsimportSchemaAsAttributes@plumbing(SchemaAsAttributes)classSchemaAsAttributesNode(BaseNode):schema={'int':schema.Int(default=1),}Nodeattrsnow provides access to the schema members:>>>node=SchemaAsAttributesNode()>>>node.attrs['int']1Schema members can also be defined as class attributes. This is syntactically
the most elegant way, but comes with the tradeoff of possible naming conflicts:fromnode.behaviorsimportSchemaProperties@plumbing(DefaultInit,MappingNode,DictStorage,SchemaProperties)classSchemaPropertiesNode:text=schema.Str(default='Text')Here we accesstextas class attribute:>>>node=SchemaPropertiesNode()>>>node.text'Text'>>>node.text=1Traceback (most recent call last):...ValueError:1 is no <class 'str'> typePlumbing BehaviorsGeneral Behaviorsnode.behaviors.DefaultInitPlumbing behavior providing default__init__function on node. This
behavior is going to be deprecated in future versions. Usenode.behaviors.NodeInitinstead.
Seenode.interfaces.IDefaultInit.node.behaviors.NodeInitPlumbing behavior for transparent setting of__name__and__parent__at object initialization time.
Seenode.interfaces.INodeInit.node.behaviors.NodeFill in gaps for full INode API. Seenode.interfaces.INode.node.behaviors.ContentishNodeA node which can contain children. Seenode.interfaces.IContentishNode. Concrete implementations arenode.behaviors.MappingNodeandnode.behaviors.SequenceNode.node.behaviors.AttributesProvide attributes on node. Seenode.interfaces.IAttributes. Ifnode.behaviors.Nodespacesis applied on node, the attributes instance
gets stored internally in__attrs__nodespace, otherwise its set on__attrs__attribute.node.behaviors.EventsProvide an event registration and dispatching mechanism.
Seenode.interfaces.IEvents.node.behaviors.BoundContextMechanism for scoping objects to interfaces and classes.
Seenode.interfaces.IBoundContext.node.behaviors.NodeReferencePlumbing behavior holding an index of nodes contained in the tree.
Seenode.interfaces.INodeReference.node.behaviors.WildcardFactoryPlumbing behavior providing factories by wildcard patterns.
Seenode.interfaces.IWildcardFactory.Mapping Behaviorsnode.behaviors.MappingNodeTurn an object into a mapping node. Extendsnode.behaviors.Node.
Seenode.interfaces.IMappingNode.node.behaviors.MappingAdoptPlumbing behavior that provides__name__and__parent__attribute
adoption on child nodes of mapping.
Seenode.interfaces.IMappingAdopt.node.behaviors.MappingConstraintsPlumbing behavior for constraints on mapping nodes.
Seenode.interfaces.IMappingConstraints.node.behaviors.UnicodeAwarePlumbing behavior to ensure unicode for keys and string values.
Seenode.interfaces.IUnicodeAware.node.behaviors.AliasPlumbing behavior that provides aliasing of child keys.
Seenode.interfaces.IAlias.node.behaviors.AsAttrAccessPlumbing behavior to get node as IAttributeAccess implementation.
Seenode.interfaces.IAsAttrAccess.node.behaviors.ChildFactoryPlumbing behavior providing child factories.
Seenode.interfaces.IChildFactory.node.behaviors.FixedChildrenPlumbing Behavior that initializes a fixed dictionary as children.
Seenode.interfaces.IFixedChildren.node.behaviors.NodespacesPlumbing behavior for providing nodespaces on node.
Seenode.interfaces.INodespaces.node.behaviors.LifecyclePlumbing behavior taking care of lifecycle events.
Seenode.interfaces.ILifecycle.node.behaviors.AttributesLifecyclePlumbing behavior for handling lifecycle events on attribute manipulation.
Seenode.interfaces.IAttributesLifecycle.node.behaviors.InvalidatePlumbing behavior for node invalidation.
Seenode.interfaces.Invalidate.node.behaviors.VolatileStorageInvalidatePlumbing behavior for invalidating nodes using a volatile storage.
Seenode.interfaces.Invalidate.node.behaviors.CachePlumbing behavior for caching.
Seenode.interfaces.ICache.node.behaviors.MappingOrderPlumbing behavior for ordering support on mapping nodes.
Seenode.interfaces.IMappingOrder.node.behaviors.UUIDAwarePlumbing behavior providing a uuid on nodes.
Seenode.interfaces.IUUIDAware.node.behaviors.MappingReferencePlumbing behavior to providenode.interfaces.INodeReferenceon mapping
nodes. Seenode.interfaces.IMappingReference.node.behaviors.MappingStorageProvide abstract mapping storage access.
Seenode.interfaces.IMappingStorage.node.behaviors.DictStorageProvide dictionary storage. Extendsnode.behaviors.MappingStorage.
Seenode.interfaces.IMappingStorage.node.behaviors.OdictStorageProvide ordered dictionary storage. Extendsnode.behaviors.MappingStorage. Seenode.interfaces.IMappingStorage.node.behaviors.FallbackProvide a way to fall back to values by subpath stored on another node.
Seenode.interfaces.IFallback.node.behaviors.SchemaProvide schema validation and value serialization on node values.
Seenode.interfaces.ISchema.node.behaviors.SchemaAsAttributesProvide schema validation and value serialization on node values via
dedicated attributes object.
Seenode.interfaces.ISchemaAsAttributes.node.behaviors.SchemaPropertiesProvide schema fields as class properties.
Seenode.interfaces.ISchemaProperties.node.behaviors.MappingFilterFilter mapping children by class or interface.
Seenode.interfaces.IChildFilter.Sequence Behaviorsnode.behaviors.SequenceNodeTurn an object into a sequence node. Extendsnode.behaviors.Node.
Seenode.interfaces.IMappingNode.node.behaviors.SequenceAdoptPlumbing behavior that provides__name__and__parent__attribute
adoption on child nodes of sequence.
Seenode.interfaces.ISequenceAdopt.node.behaviors.SequenceConstraintsPlumbing behavior for constraints on sequence nodes.
Seenode.interfaces.ISequenceConstraints.node.behaviors.SequenceStorageProvide abstract sequence storage access.
Seenode.interfaces.ISequenceStorage.node.behaviors.ListStorageProvide list storage. Seenode.interfaces.ISequenceStorage.node.behaviors.SequenceReferencePlumbing behavior to providenode.interfaces.INodeReferenceon sequence
nodes. Seenode.interfaces.ISequenceReference.node.behaviors.SequenceFilterFilter sequence children by class or interface.
Seenode.interfaces.IChildFilter.node.behaviors.SequenceOrderPlumbing behavior for ordering support on sequence nodes.
Seenode.interfaces.ISequenceOrder.JSON SerializationNodes can be serialized to and deserialized from JSON:>>>fromnode.serializerimportserialize>>>json_dump=serialize(BaseNode(name='node'))>>>fromnode.serializerimportdeserialize>>>deserialize(json_dump)<BaseNode object 'node' at ...>For details on serialization API please read file indocs/archive/serializer.rst.Python VersionsPython 2.7, 3.7+May work with other versions (untested)ContributorsRobert NiederreiterFlorian FriesdorfJens KleinChanges1.2.1 (2023-04-16)Replace deprecated import ofOrderwithMappingOrderinnode.base.
[rnix]1.2 (2022-12-05)Do not overwriteuuidinnode.behaviors.UUIDAware.__init__ifuuidalready set.
[rnix]Renamenode.interfaces.IOrdertonode.interfaces.IMappingOrderandnode.behaviors.Ordertonode.behaviors.MappingOrder.
B/C is kept.
[rnix]Introducenode.behaviors.ISequenceOrderandnode.interfaces.SequenceOrder.
[rnix]Introducenode.interfaces.INodeOrder. Used as base fornode.interfaces.IMappingOrderandnode.interfaces.ISequenceOrder.
[rnix]Add rich comparison functions__lt__,__le__,__gt__and__ge__tonode.utils.Unset.
[rnix]Breaking changes:Importing B/COrderbehavior fromnode.behaviors.ordernot works any more. Please import fromnode.behaviors.
[rnix]1.1 (2022-10-06)Addnode.schema.DateTime,node.schema.DateTimeSerializerandnode.schema.datetime_serializer.
[rnix]Subclassthreading.localfornode.behaviors.lifecycle._lifecycle_context,node.behaviors.events._attribute_subscribersandnode.behaviors.schema._schema_propertyobjects in order to safely provide
default values.
[rnix]Introducenode.interfaces.IChildFilter,node.behaviors.MappingFilterandnode.behaviors.SequenceFilter.
[rnix]Introducenode.interfaces.IWildcardFactoryandnode.behaviors.WildcardFactory.
[rnix]Introducenode.interfaces.INodeInitandnode.behaviors.NodeInit.
[rnix]DeprecateIFixedChildren.fixed_children_factoriesUseIFixedChildren.factoriesinstead.
[rnix]Introducenode.interfaces.IContentishNodeandnode.behaviors.ContentishNode. Use as base for mapping and sequence nodes.
[rnix]insertbefore,insertafterandswapinnode.behaviors.Orderalternatively accept node names as arguments where possible.
[rnix]insertbefore,insertafter, andinsertfirstandinsertlastinnode.behaviors.Orderinternally usemovebefore,moveafter,movefirstandmovelastofodictto avoid modifying the data
structure before__setitem__gets called.
[rnix]Extendnode.interfaces.IOrderrespectivenode.behaviors.Orderbymovebefore,moveafter,movefirstandmovelast.
[rnix]Reset__parent__innode.behaviors.Node.detach. Node is no longer
contained in tree.
[rnix]IntroduceIndexViolationErrorwhich inherits fromValueErrorand
raise it in reference related behaviors instead ofValueErrorwhere
appropriate.
[rnix]Introducenode.interfaces.INodeReferenceandnode.behaviors.NodeReference.
[rnix]Introducenode.interfaces.ISequenceReferenceandnode.behaviors.SequenceReference.
[rnix]Renamenode.interfaces.IReferencetonode.interfaces.IMappingReferenceandnode.behaviors.Referencetonode.behaviors.MappingReference.
B/C is kept.
[rnix]Breaking changes:Remove_notify_suppressflag fromLifecyclebehavior. Introducesuppress_lifecycle_eventscontextmanager as substitute.
[rnix]ImportingChildFactoryandFixedChildrenfromnode.behaviors.commonnot works any more. Please import fromnode.behaviors.
[rnix]Importing B/CReferencebehavior fromnode.behaviors.referencenot works any more. Please import fromnode.behaviors.
[rnix]1.0 (2022-03-17)Implement__copy__and__deepcopy__onnode.utils.UNSET.
[rnix]Introducenode.interfaces.ISequenceConstraintsandnode.behaviors.SequenceConstraints.
[rnix]Renamenode.interfaces.INodeChildValidatetonode.interfaces.IMappingConstraintsandnode.behaviors.NodeChildValidatetonode.behaviors.MappingConstraints.MappingConstraintsimplementation moved fromnode.behaviors.commontonode.behaviors.constraints. B/C is kept.
[rnix]Introducenode.interfaces.ISequenceAdoptandnode.behaviors.SequenceAdopt.
[rnix]MappingAdoptnow catches all exceptions instead of onlyAttributeError,KeyErrorandValueError.
[rnix]Renamenode.interfaces.IAdopttonode.interfaces.IMappingAdoptandnode.behaviors.Adopttonode.behaviors.MappingAdopt.MappingAdoptimplementation moved fromnode.behaviors.commontonode.behaviors.adopt. B/C is kept.
[rnix]node.behaviors.Attributesnow also works ifnode.behaviors.Nodespacesis not applied.
[rnix]Introducenode.behaviors.Nodewhich implements onlynode.interfaces.INodecontract. It is used as base fornode.behaviors.MappingNodeandnode.behaviors.SequcneNode.
[rnix]Do not inheritnode.interfaces.INodefromzope.interfaces.common.mapping.IFullMappingany more. Data model specific
interfaces are added now vianode.interfaces.IMappingNodeandnode.interfaces.ISequenceNode.
[rnix]Introduce sequence nodes. Sequence nodes are implemented vianode.behaviors.SequcneNodeandnode.behaviors.ListStorage.
[rnix]Renamenode.interfaces.INodifytonode.interfaces.IMappingNodeandnode.behaviors.Nodifytonode.behaviors.MappingNode.MappingNodeimplementation moved fromnode.behaviors.nodifytonode.behaviors.mapping. B/C is kept.
[rnix]Renamenode.interfaces.IStoragetonode.interfaces.IMappingStorageandnode.behaviors.Storagetonode.behaviors.Storage. B/C is kept.
[rnix]Add key and value type validation to schema fields where appropriate.
[rnix]Introduce serializer support to schema fields. Add a couple of concrete field
serializer implementations tonode.schema.serializer.
[rnix]AddODictandNodeschema fields tonode.schema.fields.
[rnix]Addnode.schema.fields.IterableFieldand use as base class forList,TupleandSetschema fields.Introducenode.behaviors.schema.SchemaPropertiesplumbing behavior.
[rnix]Split upnode.schemamodule into a package.
[rnix]Introducenode.behaviors.context.BoundContextplumbing behavior.
[rnix]Breaking changes:Removenode.behaviors.GetattrChildren. Seenode.utils.AttributeAccessinstead if you need to access node children via__getattr__.
[rnix]Importing B/CAdoptbehavior fromnode.behaviors.commonnot works any more. Please import fromnode.behaviors.
[rnix]Importing B/CNodeChildValidatebehavior fromnode.behaviors.commonnot works any more. Please import fromnode.behaviors.
[rnix]Importing B/CNodifybehavior fromnode.behaviors.nodifynot works any more. Please import fromnode.behaviors.
[rnix]Remove deprecated B/C import locationnode.parts.
[rnix]node.behaviors.schema.Schemano longer considers wildcard fields.
[rnix]node.behaviors.schema.Schema.__setitem__deletes value from related
storage for field if value isnode.utils.UNSET.
[rnix]node.behaviors.schema.Schema.__getitem__always returns default value for
field instead of raisingKeyErrorif no default is set.
[rnix]Default value ofnode.schema.fields.Field.defaultisnode.utils.UNSETnow.
[rnix]node.schema.fields.Field.validateraises exception if validation fails
instead of returning boolean.
[rnix]0.9.28 (2021-11-08)Add missingnode.interfaces.INodeAttributesinterface.
[rnix]Add missingattribute_access_for_attrsattribute toIAttributesinterface.
[rnix]Renamenode.behaviors.common.NodeChildValidate.allow_non_node_childstoallow_non_node_children. A Deprecation warning is printed if the
old attribute is used.
[rnix]Introducenode.behaviors.schema.Schema,node.behaviors.schema.SchemaAsAttributesand related schema definitions
innode.schema.
[rnix]0.9.27 (2021-10-21)Exposefirst_key,last_key,next_keyandprev_keyfrom
odict storage onOrderbehavior.
[rnix, 2021-10-21]Add basic serializer settings mechanism.
[rnix, 2021-07-20]0.9.26 (2021-05-10)Usenode.utils.safe_decodeinnode.behaviors.nodify.Nodify.treerepr.
[rnix, 2021-05-04]Addnode.utils.safe_encodeandnode.utils.safe_decode.
[rnix, 2021-05-04]0.9.25 (2020-03-30)Introduceuuid_factoryfunction onnode.interfaces.IUUIDAwareand
implement default function innode.behaviors.common.UUIDAware.
[rnix, 2020-03-01]RenameNodeTestCase.expect_errortoNodeTestCase.expectError.
[rnix, 2019-09-04]RenameNodeTestCase.check_outputtoNodeTestCase.checkOutput.
[rnix, 2019-09-04]Introduceprefixkeyword argument inNodify.treerepr.
[rnix, 2019-09-04]0.9.24 (2019-07-10)Overhaulnode.behaviors.Order. Use related functions fromodictwhere
appropriate.
[rnix, 2019-07-10]Remove superfluousextra_requirefromsetup.py.
[rnix, 2019-04-25]Drop Support for python < 2.7 and < 3.3.
[rnix, 2019-04-25]0.9.23 (2018-11-07)Use property decorators fornode.behaviors.reference.Reference.uuid.
[rnix, 2017-12-15]0.9.22 (2017-07-18)Addalways_dispatchkeyword argument tonode.behaviors.events.EventAttributeconstructor which defines whether
events are always dispatched on__set__, not only if attribute value
changes.
[rnix, 2017-06-20]Usenode.utils.UNSETas defaultdefaultvalue innode.behaviors.events.EventAttribute.__init__.
[rnix, 2017-06-19]Introducenode.behaviors.events.EventAttribute.subscriberdecorator which
can be used to register attribute subscribers.
[rnix, 2017-06-19]Move event dispatching related classes and functions fromnode.eventstonode.behaviors.eventsand import it from there innode.events.
[rnix, 2017-06-16]Introducenode.interfaces.IEventsand implementnode.behaviors.events.Eventsbehavior. Contains business logic fromnode.events.EventDispatcher. Use new behavior onEventDispatcher.
[rnix, 2017-06-16]Createsuppress_eventscontext manager which can be used to
suppress event notification in conjunction withnode.behaviors.Eventsbehavior.
[rnix, 2017-06-15]Createnode.behaviors.fallback.fallback_processingcontext manager and
and use it innode.behaviors.fallback.Fallback.__getitem__to check
whether fallback processing is active.
[rnix, 2017-06-15]0.9.21 (2017-06-15)Introducenode.events.EventDispatcherandnode.events.EventAttribute.
[rnix, 2017-06-15]Usesetattrininstance_propertydecorator instead ofobject.__setattr__in order to avoid errors with custom low level__setattr__implementations.
[rnix, 2017-06-14]0.9.20 (2017-06-07)Type cast sort key tonode.compat.UNICODE_TYPEinnode.behaviors.Nodify.treereprto avoid unicode decode errors.
[rnix, 2017-06-07]0.9.19 (2017-06-07)Python 3 and pypy compatibility.
[rnix, 2017-06-02]Drop support for Python < 2.7.
[rnix, 2017-06-02]Add__bool__tonode.behaviors.Nodify.
[rnix, 2017-06-02]Add__bool__tonode.utils.UNSET.
[rnix, 2017-06-02]Addtreereprinnode.behaviors.nodify.Nodifyand move code fromprinttreeto it. Returs tree representation as string instead of printing
it.printtreeusestreereprnow. As enhancementtreereprsorts
children of node if it does not implementIOrderedin order to ensure
consistend output which can be used to write tests against.
[rnix, 2017-06-02]Useobject.__getattribute__explicitely innode.utils.instance_propertyto check whether property value already has
been computed in order to avoid problems when oberwriting__getattr__on classes usinginstance_propertydecorator.
[rnix, 2017-06-02]0.9.18.1 (2017-02-23)Fix permissions.
[rnix, 2017-02-23]0.9.18 (2017-02-14)Addnode.utils.node_by_path.
[rnix, 2017-02-07]Do not depend onunittest2since its is not used.
[jensens, 2017-01-17]Addnode.behaviors.Fallbackbehavior.
[jensens, 2017-01-17]0.9.17 (2017-01-17)Add basic JSON serializer and deserializer.
[rnix, 2016-12-03]0.9.16 (2015-10-08)Only encode name innode.behaviors.nodify.Nodify.__repr__andnode.behaviors.nodify.Nodify.nodereprif name is unicode instance.
[rnix, 2015-10-03]Improvenode.behaviors.nodify.Nodify.printtree. None node children are
printed with key.
[rnix, 2015-10-03]0.9.15 (2014-12-17)Fix dependency declaration toodictin order to make setuptools 8.x+
happy; using>=instead of>now.
[jensens, 2014-12-17]0.9.14useplumbingdecorator instead ofplumbermetaclass.
[rnix, 2014-07-31]0.9.13Introducenode.behaviors.cache.VolatileStorageInvalidate.
[rnix, 2014-01-15]0.9.12Addzope.componentto install dependencies.
[rnix, 2013-12-09]0.9.11Usenode.utils.UNSETinstance innode.behaviors.mapping.ExtendedWriteMapping.pop.
[rnix, 2013-02-10]Improvenode.utils.Unset. AddUnsetinstance atnode.utils.UNSET.
[rnix, 2013-02-10]0.9.10Fixnode.utils.StrCodec.encodeto return value as is if str and decoding
failed.
[rnix, 2012-11-07]0.9.9Python 2.7 compatibility.
[rnix, 2012-10-15]Removezope.component.eventB/C.
[rnix, 2012-10-15]Removezope.locationB/C.
[rnix, 2012-10-15]Removezope.lifecycleeventB/C.
[rnix, 2012-10-15]Pep8.
[rnix, 2012-10-15]0.9.8Deprecate the use ofnode.parts. Usenode.behaviorsinstead.
[rnix, 2012-07-28]Adopt toplumber1.2
[rnix, 2012-07-28]0.9.7Introducenode.interfaces.IOrderedMarker interface. Set this interface
onnode.parts.storage.OdictStorage.
[rnix, 2012-05-21]node.parts.mapping.ClonableMappingnow supportsdeepcopy.
[rnix, 2012-05-18]Usezope.interface.implementerinstead ofzope.interface.implementsall over the place.
[rnix, 2012-05-18]Remove superfluos interfaces.
[rnix, 2012-05-18]RemoveZodictfromnode.utils.
[rnix, 2012-05-18]RemoveAliasedNodespace, useAliaspart instead.
[rnix, 2012-05-18]Move aliaser objects fromnode.aliasingtonode.parts.alias.
[rnix, 2012-05-18]Removecompositionmodule.
[rnix, 2012-05-18]Removebbbmodule.
[rnix, 2012-05-18]0.9.6Do not inheritnode.parts.Referencefromnode.parts.UUIDAware.
[rnix, 2012-01-30]Setuuidinnode.parts.Reference.__init__plumb.
[rnix, 2012-01-30]0.9.5addnode.parts.nodify.Nodify.acquirefunction.
[rnix, 2011-12-05]addnode.parts.ChildFactoryplumbing part.
[rnix, 2011-12-04]addnode.parts.UUIDAwareplumbing part.
[rnix, 2011-12-02]fixnode.parts.Order.swapin order to work with pickled nodes.
[rnix, 2011-11-28]usenode.nameinstead ofnode.__name__innode.parts.nodify.Nodify.path.
[rnix, 2011-11-17]addswaptonode.parts.Order.
[rnix, 2011-10-05]addinsertfirstandinsertlasttonode.parts.Order.
[rnix, 2011-10-02]0.9.4addnode.utils.debugdecorator.
[rnix, 2011-07-23]remove non storage contract specific properties fromnode.aliasing.AliasedNodespace[rnix, 2011-07-18]node.aliasingtest completion
[rnix, 2011-07-18]Add non strict functionality tonode.aliasing.DictAliaserfor accessing
non aliased keys as is as fallback
[rnix, 2011-07-18]ConsiderINodeimplementing objects innode.utils.StrCodec[rnix, 2011-07-16]Remove duplicate implements in storage parts
[rnix, 2011-05-16]0.9.3Increase test coverage
[rnix, 2011-05-09]Add interfacesIFixedChildrenandIGetattrChildrenfor related parts.
[rnix, 2011-05-09]RenameUnicodepart toUnicodeAware.
[rnix, 2011-05-09]Addnode.utils.StrCodec.
[rnix, 2011-05-09]InheritINodifyinterface fromINode.
[rnix, 2011-05-08]Locking tests. Addtime.sleepafter thread start.
[rnix, 2011-05-08]CleanupBaseTester, removesorted_outputflag (always sort), also
search class bases for detection inwherefrom.
[rnix, 2011-05-08]Remove useless try/except inutils.AttributeAccess.
[rnix, 2011-05-08]Addinstance_propertydecorator to utils.
[rnix, 2011-05-06]AddFixedChildrenandGetattrChildrenparts.
[chaoflow, 2011-04-22]0.9.2Add__nonzero__onNodifiypart always return True.
[rnix, 2011-03-15]0.9.1Providenode.base.Nodewith same behavior likezodict.Nodefor
migration purposes.
[rnix, 2011-02-08]0.9Make it work [rnix, chaoflow, et al]LicenseCopyright (c) 2009-2021, BlueDynamics Alliance, Austria
Copyright (c) 2021-2022, Node Contributors
All rights reserved.Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.