{ "info": { "author": "BlueDynamics Alliance", "author_email": "dev@bluedynamics.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development" ], "description": "node\n====\n\nThis package is the successor of `zodict `_.\n\n\nOverview\n--------\n\nData structures could be described as trees. Some are by nature ``treeish``,\nlike XML documents, LDAP directories or filesystem directory trees, while others\ncan be treated that way.\n\nFurthermore, python has elegant ways for customizing all sorts of datamodel related\nAPIs. The `dictionary container type\n`_\nfits almost completely the purpose of representing a node of a tree. The same\nAPI is also described in ``zope.interface.common.mapping.IFullMapping``.\nAdditionaly a node must provide hierarchy information. In this case the\ncontract of ``zope.location.interfaces.ILocation`` is used.\n\nHaving data structures as such trees has some advantages:\n\n- Unified data access API to different data models and/or sources\n\n- Trees are traversable in both directions\n\n- Once in memory, node trees are fast to deal with\n\n- Software working on node trees may not need to know about internal data\n structures, as long as the node tree implementation provides the correct\n interface contracts\n\n\nUsage\n-----\n\n``node`` ships with some \"ready-to-import-and-use\" nodes.\n\nAn unordered node. This can be used as base for trees where order of items\ndoesn't matter:\n\n.. code-block:: pycon\n\n >>> from node.base import BaseNode\n >>> root = BaseNode(name='root')\n >>> root['child'] = BaseNode()\n >>> root.printtree()\n : root\n : child\n\nAn ordered node. The order of items is preserved:\n\n.. code-block:: pycon\n\n >>> from node.base import OrderedNode\n >>> root = OrderedNode(name='orderedroot')\n >>> root['foo'] = OrderedNode()\n >>> root['bar'] = OrderedNode()\n >>> root.printtree()\n : orderedroot\n : foo\n : bar\n\n >>> root.items()\n [('foo', ),\n ('bar', )]\n\nA full API description of the node interface can be found at\n``node.interfaces.INode``.\n\n\nA more fine granular control of node functionality\n--------------------------------------------------\n\n``node`` utilizes the `plumber `_ package.\n\nThus, different behaviors of nodes are provided by ``plumbing behaviors``. Read\nthe documentation of ``plumber`` for details about the plumbing system:\n\n.. code-block:: pycon\n\n >>> from plumber import plumbing\n >>> from node.behaviors import (\n ... Nodespaces,\n ... Attributes,\n ... Lifecycle,\n ... NodeChildValidate,\n ... Adopt,\n ... DefaultInit,\n ... Nodify,\n ... OdictStorage,\n ... )\n\n >>> @plumbing(\n ... Nodespaces,\n ... Attributes,\n ... Lifecycle,\n ... NodeChildValidate,\n ... Adopt,\n ... DefaultInit,\n ... Nodify,\n ... OdictStorage)\n ... class CustomNode(object):\n ... pass\n\n >>> dir(CustomNode)\n ['__class__', '__contains__', '__delattr__', '__delitem__',\n '__dict__', '__doc__', '__format__', '__getattribute__',\n '__getitem__', '__hash__', '__implemented__', '__init__',\n '__iter__', '__len__', '__module__', '__name__',\n '__new__', '__nonzero__', '__parent__', '__plumbing__',\n '__plumbing_stacks__', '__provides__', '__reduce__',\n '__reduce_ex__', '__repr__', '__setattr__', '__setitem__',\n '__sizeof__', '__str__', '__subclasshook__', '__weakref__',\n '_nodespaces', '_notify_suppress', 'acquire', 'allow_non_node_childs',\n 'attribute_access_for_attrs', 'attributes', 'attributes_factory',\n 'attrs', 'clear', 'copy', 'deepcopy', 'detach', 'events', 'filtereditems',\n 'filtereditervalues', 'filteredvalues', 'get', 'has_key', 'items',\n 'iteritems', 'iterkeys', 'itervalues', 'keys', 'name', 'noderepr',\n 'nodespaces', 'parent', 'path', 'pop', 'popitem', 'printtree',\n 'root', 'setdefault', 'storage', 'update', 'values']\n\nAs the ``dir`` call shows, the ``CustomNode`` class was plumbed using given behaviors,\nso defining a complete ``INode`` implementation with some additional\nbehaviours and is now easily done:\n\n.. code-block:: pycon\n\n >>> node = CustomNode()\n >>> node['child'] = CustomNode()\n >>> node.printtree()\n : None\n : child\n\n >>> from node.interfaces import INode\n >>> INode.providedBy(node)\n True\n\n\nBehaviors\n---------\n\nThe ``node`` package provides several plumbing behaviors:\n\n**node.behaviors.DefaultInit**\n Plumbing part providing default ``__init__`` function on node.\n See ``node.interfaces.IDefaultInit``.\n\n**node.behaviors.Nodify**\n Plumbing part to Fill in gaps for full INode API.\n See ``node.interfaces.INodify``.\n\n**node.behaviors.Adopt**\n Plumbing part that provides adoption of children.\n See ``node.interfaces.IAdopt``.\n\n**node.behaviors.NodeChildValidate**\n Plumbing part for child node validation.\n See ``node.interfaces.INodeChildValidate``.\n\n**node.behaviors.UnicodeAware**\n Plumbing part to ensure unicode for keys and string values.\n See ``node.interfaces.IUnicodeAware``.\n\n**node.behaviors.Alias**\n Plumbing part that provides aliasing of child keys.\n See ``node.interfaces.IAlias``.\n\n**node.behaviors.AsAttrAccess**\n Plumbing part to get node as IAttributeAccess implementation.\n See ``node.interfaces.IAsAttrAccess``.\n\n**node.behaviors.ChildFactory**\n Plumbing part providing child factories which are invoked at\n ``__getitem__`` if object by key is not present at plumbing endpoint yet.\n See ``node.interfaces.IChildFactory``.\n\n**node.behaviors.FixedChildren**\n Plumbing part that initializes a fixed dictionary as children.\n See ``node.interfaces.IFixedChildren``.\n\n**node.behaviors.GetattrChildren**\n Plumbing part for child access via ``__getattr__``, given the attribute\n name is unused.\n See ``node.interfaces.IGetattrChildren``.\n\n**node.behaviors.Nodespaces**\n Plumbing part for providing nodespaces on node.\n See ``node.interfaces.INodespaces``.\n\n**node.behaviors.Attributes**\n Plumbing part to provide attributes on node.\n Requires ``node.behaviors.Nodespaces`` part.\n See ``node.interfaces.IAttributes``.\n\n**node.behaviors.Lifecycle**\n Plumbing part taking care of lifecycle events.\n See ``node.interfaces.ILifecycle``.\n\n**node.behaviors.AttributesLifecycle**\n Plumbing part for handling ifecycle events at attributes manipulation.\n See ``node.interfaces.IAttributesLifecycle``.\n\n**node.behaviors.Invalidate**\n Plumbing part for node invalidation.\n See ``node.interfaces.Invalidate``.\n\n**node.behaviors.VolatileStorageInvalidate**\n Plumbing part for invalidating nodes using a volatile storage.\n See ``node.interfaces.Invalidate``.\n\n**node.behaviors.Cache**\n Plumbing part for caching.\n See ``node.interfaces.ICache``.\n\n**node.behaviors.Order**\n Plumbing part for ordering support.\n See ``node.interfaces.IOrder``.\n\n**node.behaviors.UUIDAware**\n Plumbing part providing a uuid on nodes.\n See ``node.interfaces.IUUIDAware``.\n\n**node.behaviors.Reference**\n Plumbing part holding an index of all nodes contained in the tree.\n See ``node.interfaces.IReference``.\n\n**node.behaviors.Storage**\n Provide abstract storage access.\n See ``node.interfaces.IStorage``.\n\n**node.behaviors.DictStorage**\n Provide dictionary storage.\n See ``node.interfaces.IStorage``.\n\n**node.behaviors.OdictStorage**\n Provide ordered dictionary storage.\n See ``node.interfaces.IStorage``.\n\n**node.behaviors.Fallback**\n Provide a way to fall back to values by subpath stored on another node.\n See ``node.interfaces.IFallback``.\n\n**node.behaviors.Events**\n Provide an event registration and dispatching mechanism.\n See ``node.interfaces.IEvents``.\n\n\nJSON Serialization\n------------------\n\nNodes can be serialized to and deserialized from JSON:\n\n.. code-block:: pycon\n\n >>> from node.serializer import serialize\n >>> json_dump = serialize(BaseNode(name='node'))\n\n >>> from node.serializer import deserialize\n >>> deserialize(json_dump)\n \n\nFor details on serialization API please read file in\n``docs/archive/serializer.rst``.\n\n\nMigration\n---------\n\nA node which behaves like ``zodict.Node`` is contained in ``node.base.Node``.\nThis node is supposed to be used for migration from zodict.\n\nIt's also useful to take a look at the behaviors the original node is build\nfrom.\n\nProbably an implementation does not need all the behaviors at once. In this case\ndefine the node plumbing directly on a node class instead of inheriting from\n``node.base.Node``.\n\n\nTestCoverage\n------------\n\n.. image:: https://travis-ci.org/bluedynamics/node.svg?branch=master\n :target: https://travis-ci.org/bluedynamics/node\n\nSummary of the test coverage report::\n\n Name Stmts Miss Cover\n ---------------------------------------------------------------------------\n src/node/base.py 23 0 100%\n src/node/behaviors/__init__.py 40 0 100%\n src/node/behaviors/alias.py 103 0 100%\n src/node/behaviors/attributes.py 37 0 100%\n src/node/behaviors/cache.py 69 0 100%\n src/node/behaviors/common.py 130 0 100%\n src/node/behaviors/events.py 114 0 100%\n src/node/behaviors/fallback.py 45 0 100%\n src/node/behaviors/lifecycle.py 48 0 100%\n src/node/behaviors/mapping.py 117 0 100%\n src/node/behaviors/nodespace.py 33 0 100%\n src/node/behaviors/nodify.py 87 0 100%\n src/node/behaviors/order.py 42 0 100%\n src/node/behaviors/reference.py 83 0 100%\n src/node/behaviors/storage.py 31 0 100%\n src/node/compat.py 10 0 100%\n src/node/events.py 32 0 100%\n src/node/interfaces.py 101 0 100%\n src/node/locking.py 23 0 100%\n src/node/serializer.py 134 0 100%\n src/node/testing/__init__.py 1 0 100%\n src/node/testing/base.py 66 0 100%\n src/node/testing/env.py 18 0 100%\n src/node/testing/fullmapping.py 177 0 100%\n src/node/tests/__init__.py 88 0 100%\n src/node/tests/test_alias.py 113 0 100%\n src/node/tests/test_attributes.py 38 0 100%\n src/node/tests/test_base.py 245 0 100%\n src/node/tests/test_cache.py 98 0 100%\n src/node/tests/test_common.py 154 0 100%\n src/node/tests/test_events.py 184 0 100%\n src/node/tests/test_fallback.py 46 0 100%\n src/node/tests/test_lifecycle.py 105 0 100%\n src/node/tests/test_locking.py 43 0 100%\n src/node/tests/test_mapping.py 22 0 100%\n src/node/tests/test_nodespace.py 44 0 100%\n src/node/tests/test_nodify.py 45 0 100%\n src/node/tests/test_order.py 138 0 100%\n src/node/tests/test_reference.py 74 0 100%\n src/node/tests/test_serializer.py 222 0 100%\n src/node/tests/test_storage.py 41 0 100%\n src/node/tests/test_testing.py 688 0 100%\n src/node/tests/test_tests.py 50 0 100%\n src/node/tests/test_utils.py 127 0 100%\n src/node/utils.py 142 0 100%\n\nPython Versions\n---------------\n\n- Python 2.7, 3.3+, pypy\n\n- May work with other versions (untested)\n\n\nContributors\n============\n\n- Robert Niederreiter\n- Florian Friesdorf\n- Jens Klein\n\n\n\nChanges\n=======\n\n0.9.24 (2019-07-10)\n-------------------\n\n- Overhaul ``node.behaviors.Order``. Use related functions from ``odict`` where\n appropriate.\n [rnix, 2019-07-10]\n\n- Remove superfluous ``extra_require`` from ``setup.py``.\n [rnix, 2019-04-25]\n\n- Drop Support for python < 2.7 and < 3.3.\n [rnix, 2019-04-25]\n\n\n0.9.23 (2018-11-07)\n-------------------\n\n- Use property decorators for ``node.behaviors.reference.Reference.uuid``.\n [rnix, 2017-12-15]\n\n\n0.9.22 (2017-07-18)\n-------------------\n\n- Add ``always_dispatch`` keyword argument to\n ``node.behaviors.events.EventAttribute`` constructor which defines whether\n events are always dispatched on ``__set__``, not only if attribute value\n changes.\n [rnix, 2017-06-20]\n\n- Use ``node.utils.UNSET`` as default ``default`` value in\n ``node.behaviors.events.EventAttribute.__init__``.\n [rnix, 2017-06-19]\n\n- Introduce ``node.behaviors.events.EventAttribute.subscriber`` decorator which\n can be used to register attribute subscribers.\n [rnix, 2017-06-19]\n\n- Move event dispatching related classes and functions from ``node.events``\n to ``node.behaviors.events`` and import it from there in ``node.events``.\n [rnix, 2017-06-16]\n\n- Introduce ``node.interfaces.IEvents`` and implement\n ``node.behaviors.events.Events`` behavior. Contains business logic from\n ``node.events.EventDispatcher``. Use new behavior on ``EventDispatcher``.\n [rnix, 2017-06-16]\n\n- Create ``suppress_events`` context manager which can be used to\n suppress event notification in conjunction with ``node.behaviors.Events``\n behavior.\n [rnix, 2017-06-15]\n\n- Create ``node.behaviors.fallback.fallback_processing`` context manager and\n and use it in ``node.behaviors.fallback.Fallback.__getitem__`` to check\n whether fallback processing is active.\n [rnix, 2017-06-15]\n\n\n0.9.21 (2017-06-15)\n-------------------\n\n- Introduce ``node.events.EventDispatcher`` and ``node.events.EventAttribute``.\n [rnix, 2017-06-15]\n\n- Use ``setattr`` in ``instance_property`` decorator instead of\n ``object.__setattr__`` in order to avoid errors with custom low level\n ``__setattr__`` implementations.\n [rnix, 2017-06-14]\n\n\n0.9.20 (2017-06-07)\n-------------------\n\n- Type cast sort key to ``node.compat.UNICODE_TYPE`` in\n ``node.behaviors.Nodify.treerepr`` to avoid unicode decode errors.\n [rnix, 2017-06-07]\n\n\n0.9.19 (2017-06-07)\n-------------------\n\n- Python 3 and pypy compatibility.\n [rnix, 2017-06-02]\n\n- Drop support for Python < 2.7.\n [rnix, 2017-06-02]\n\n- Add ``__bool__`` to ``node.behaviors.Nodify``.\n [rnix, 2017-06-02]\n\n- Add ``__bool__`` to ``node.utils.UNSET``.\n [rnix, 2017-06-02]\n\n- Add ``treerepr`` in ``node.behaviors.nodify.Nodify`` and move code from\n ``printtree`` to it. Returs tree representation as string instead of printing\n it. ``printtree`` uses ``treerepr`` now. As enhancement ``treerepr`` sorts\n children of node if it does not implement ``IOrdered`` in order to ensure\n consistend output which can be used to write tests against.\n [rnix, 2017-06-02]\n\n- Use ``object.__getattribute__`` explicitely in\n ``node.utils.instance_property`` to check whether property value already has\n been computed in order to avoid problems when oberwriting ``__getattr__``\n on classes using ``instance_property`` decorator.\n [rnix, 2017-06-02]\n\n\n0.9.18.1 (2017-02-23)\n---------------------\n\n- Fix permissions.\n [rnix, 2017-02-23]\n\n\n0.9.18 (2017-02-14)\n-------------------\n\n- Add ``node.utils.node_by_path``.\n [rnix, 2017-02-07]\n\n- Do not depend on ``unittest2`` since its is not used.\n [jensens, 2017-01-17]\n\n- Add ``node.behaviors.Fallback`` behavior.\n [jensens, 2017-01-17]\n\n\n0.9.17 (2017-01-17)\n-------------------\n\n- Add basic JSON serializer and deserializer.\n [rnix, 2016-12-03]\n\n\n0.9.16 (2015-10-08)\n-------------------\n\n- Only encode name in ``node.behaviors.nodify.Nodify.__repr__`` and\n ``node.behaviors.nodify.Nodify.noderepr`` if name is unicode instance.\n [rnix, 2015-10-03]\n\n- Improve ``node.behaviors.nodify.Nodify.printtree``. None node children are\n printed with key.\n [rnix, 2015-10-03]\n\n\n0.9.15 (2014-12-17)\n-------------------\n\n- Fix dependency declaration to ``odict`` in order to make setuptools 8.x+\n happy; using ``>=`` instead of ``>`` now.\n [jensens, 2014-12-17]\n\n\n0.9.14\n------\n\n- use ``plumbing`` decorator instead of ``plumber`` metaclass.\n [rnix, 2014-07-31]\n\n\n0.9.13\n------\n\n- Introduce ``node.behaviors.cache.VolatileStorageInvalidate``.\n [rnix, 2014-01-15]\n\n\n0.9.12\n------\n\n- Add ``zope.component`` to install dependencies.\n [rnix, 2013-12-09]\n\n\n0.9.11\n------\n\n- Use ``node.utils.UNSET`` instance in\n ``node.behaviors.mapping.ExtendedWriteMapping.pop``.\n [rnix, 2013-02-10]\n\n- Improve ``node.utils.Unset``. Add ``Unset`` instance at\n ``node.utils.UNSET``.\n [rnix, 2013-02-10]\n\n\n0.9.10\n------\n\n- Fix ``node.utils.StrCodec.encode`` to return value as is if str and decoding\n failed.\n [rnix, 2012-11-07]\n\n\n0.9.9\n-----\n\n- Python 2.7 compatibility.\n [rnix, 2012-10-15]\n\n- Remove ``zope.component.event`` B/C.\n [rnix, 2012-10-15]\n\n- Remove ``zope.location`` B/C.\n [rnix, 2012-10-15]\n\n- Remove ``zope.lifecycleevent`` B/C.\n [rnix, 2012-10-15]\n\n- Pep8.\n [rnix, 2012-10-15]\n\n\n0.9.8\n-----\n\n- Deprecate the use of ``node.parts``. Use ``node.behaviors`` instead.\n [rnix, 2012-07-28]\n\n- Adopt to ``plumber`` 1.2\n [rnix, 2012-07-28]\n\n\n0.9.7\n-----\n\n- Introduce ``node.interfaces.IOrdered`` Marker interface. Set this interface\n on ``node.parts.storage.OdictStorage``.\n [rnix, 2012-05-21]\n\n- ``node.parts.mapping.ClonableMapping`` now supports ``deepcopy``.\n [rnix, 2012-05-18]\n\n- Use ``zope.interface.implementer`` instead of ``zope.interface.implements``\n all over the place.\n [rnix, 2012-05-18]\n\n- Remove superfluos interfaces.\n [rnix, 2012-05-18]\n\n- Remove ``Zodict`` from ``node.utils``.\n [rnix, 2012-05-18]\n\n- Remove ``AliasedNodespace``, use ``Alias`` part instead.\n [rnix, 2012-05-18]\n\n- Move aliaser objects from ``node.aliasing`` to ``node.parts.alias``.\n [rnix, 2012-05-18]\n\n- Remove ``composition`` module.\n [rnix, 2012-05-18]\n\n- Remove ``bbb`` module.\n [rnix, 2012-05-18]\n\n\n0.9.6\n-----\n\n- Do not inherit ``node.parts.Reference`` from ``node.parts.UUIDAware``.\n [rnix, 2012-01-30]\n\n- Set ``uuid`` in ``node.parts.Reference.__init__`` plumb.\n [rnix, 2012-01-30]\n\n\n0.9.5\n-----\n\n- add ``node.parts.nodify.Nodify.acquire`` function.\n [rnix, 2011-12-05]\n\n- add ``node.parts.ChildFactory`` plumbing part.\n [rnix, 2011-12-04]\n\n- add ``node.parts.UUIDAware`` plumbing part.\n [rnix, 2011-12-02]\n\n- fix ``node.parts.Order.swap`` in order to work with pickled nodes.\n [rnix, 2011-11-28]\n\n- use ``node.name`` instead of ``node.__name__`` in\n ``node.parts.nodify.Nodify.path``.\n [rnix, 2011-11-17]\n\n- add ``swap`` to ``node.parts.Order``.\n [rnix, 2011-10-05]\n\n- add ``insertfirst`` and ``insertlast`` to ``node.parts.Order``.\n [rnix, 2011-10-02]\n\n\n0.9.4\n-----\n\n- add ``node.utils.debug`` decorator.\n [rnix, 2011-07-23]\n\n- remove non storage contract specific properties from\n ``node.aliasing.AliasedNodespace``\n [rnix, 2011-07-18]\n\n- ``node.aliasing`` test completion\n [rnix, 2011-07-18]\n\n- Add non strict functionality to ``node.aliasing.DictAliaser`` for accessing\n non aliased keys as is as fallback\n [rnix, 2011-07-18]\n\n- Consider ``INode`` implementing objects in ``node.utils.StrCodec``\n [rnix, 2011-07-16]\n\n- Remove duplicate implements in storage parts\n [rnix, 2011-05-16]\n\n\n0.9.3\n-----\n\n- Increase test coverage\n [rnix, 2011-05-09]\n\n- Add interfaces ``IFixedChildren`` and ``IGetattrChildren`` for related parts.\n [rnix, 2011-05-09]\n\n- Rename ``Unicode`` part to ``UnicodeAware``.\n [rnix, 2011-05-09]\n\n- Add ``node.utils.StrCodec``.\n [rnix, 2011-05-09]\n\n- Inherit ``INodify`` interface from ``INode``.\n [rnix, 2011-05-08]\n\n- Locking tests. Add ``time.sleep`` after thread start.\n [rnix, 2011-05-08]\n\n- Cleanup ``BaseTester``, remove ``sorted_output`` flag (always sort), also\n search class bases for detection in ``wherefrom``.\n [rnix, 2011-05-08]\n\n- Remove useless try/except in ``utils.AttributeAccess``.\n [rnix, 2011-05-08]\n\n- Add ``instance_property`` decorator to utils.\n [rnix, 2011-05-06]\n\n- Add ``FixedChildren`` and ``GetattrChildren`` parts.\n [chaoflow, 2011-04-22]\n\n\n0.9.2\n-----\n\n- Add ``__nonzero__`` on ``Nodifiy`` part always return True.\n [rnix, 2011-03-15]\n\n\n0.9.1\n-----\n\n- Provide ``node.base.Node`` with same behavior like ``zodict.Node`` for\n migration purposes.\n [rnix, 2011-02-08]\n\n\n0.9\n---\n\n- Make it work [rnix, chaoflow, et al]\n\n\n\nLicense\n=======\n\nCopyright (c) 2009-2019, BlueDynamics Alliance, Austria\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this\n list of conditions and the following disclaimer in the documentation and/or\n other materials provided with the distribution.\n* Neither the name of the BlueDynamics Alliance nor the names of its\n contributors may be used to endorse or promote products derived from this\n software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY BlueDynamics Alliance ``AS IS`` AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL BlueDynamics Alliance BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/bluedynamics/node", "keywords": "node tree fullmapping dict", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "node", "package_url": "https://pypi.org/project/node/", "platform": "", "project_url": "https://pypi.org/project/node/", "project_urls": { "Homepage": "http://github.com/bluedynamics/node" }, "release_url": "https://pypi.org/project/node/0.9.24/", "requires_dist": null, "requires_python": "", "summary": "Building data structures as node trees", "version": "0.9.24" }, "last_serial": 5510835, "releases": { "0": [], "0.9": [ { "comment_text": "", "digests": { "md5": "8b9e8552dcab9b95af8d31deaa0259b2", "sha256": "8a895dc755c07327bf498cfc7e3dd043af5290802df2ec09886874798429be5f" }, "downloads": -1, "filename": "node-0.9.tar.gz", "has_sig": false, "md5_digest": "8b9e8552dcab9b95af8d31deaa0259b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38097, "upload_time": "2011-02-06T22:18:50", "url": "https://files.pythonhosted.org/packages/f0/1e/b76bd2a84fddab17913407b90b4df025ffa87eb43fa9350d07af372886ba/node-0.9.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "c0da916c3ce9846bf6a698de0affacab", "sha256": "a55eaf6c9d27ce2619e1ac210788644a636460230837f7ce85d813d5dc87f212" }, "downloads": -1, "filename": "node-0.9.1.tar.gz", "has_sig": false, "md5_digest": "c0da916c3ce9846bf6a698de0affacab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39645, "upload_time": "2011-02-08T15:39:45", "url": "https://files.pythonhosted.org/packages/ef/78/92f0c9984c6f3c48d487c1e586da7534521e63f2a563f5b3f52f1239ba41/node-0.9.1.tar.gz" } ], "0.9.10": [ { "comment_text": "", "digests": { "md5": "8a02a9cbd0399713b35953e4451981f9", "sha256": "c5019a0694638a72ea46a422dfdb7e9b2e5527f6eb5b41dad4dfc72a12b98695" }, "downloads": -1, "filename": "node-0.9.10.tar.gz", "has_sig": false, "md5_digest": "8a02a9cbd0399713b35953e4451981f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43900, "upload_time": "2012-11-07T17:23:22", "url": "https://files.pythonhosted.org/packages/64/f2/c1037305700f51bc7a6454324ef5a598cbd4898e4ac01e646e700c778836/node-0.9.10.tar.gz" } ], "0.9.11": [ { "comment_text": "", "digests": { "md5": "3417d2edff3f890242a32fc71f97a6af", "sha256": "365d58ac2f130a41859d6804291a260eb82028cc5b0184aba442ee956191751f" }, "downloads": -1, "filename": "node-0.9.11.tar.gz", "has_sig": false, "md5_digest": "3417d2edff3f890242a32fc71f97a6af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44091, "upload_time": "2013-02-10T11:15:00", "url": "https://files.pythonhosted.org/packages/fd/1f/a8637854081abd32ce971f9df84dfa329afb263dbbd349c1d91126eeae7f/node-0.9.11.tar.gz" } ], "0.9.12": [ { "comment_text": "", "digests": { "md5": "fbf0e7b193f8d094d17351cf1d0bf637", "sha256": "a2d0f19b2447845c4507f9c41b78c23c1b77af1c404ea78fbefd3de41039d388" }, "downloads": -1, "filename": "node-0.9.12.tar.gz", "has_sig": false, "md5_digest": "fbf0e7b193f8d094d17351cf1d0bf637", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40208, "upload_time": "2013-12-09T15:47:55", "url": "https://files.pythonhosted.org/packages/3c/d7/8b79337418e62de1699490387861374d66b3283e07cf203e20182d349af8/node-0.9.12.tar.gz" } ], "0.9.13": [ { "comment_text": "", "digests": { "md5": "d75d44a9dce38da08b0c63dd9fba7ab8", "sha256": "ccb83e0824bc9360daa7974c2cfffedd8c158421185d2584ce94cc4a571968e5" }, "downloads": -1, "filename": "node-0.9.13.tar.gz", "has_sig": false, "md5_digest": "d75d44a9dce38da08b0c63dd9fba7ab8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40681, "upload_time": "2014-05-13T16:40:09", "url": "https://files.pythonhosted.org/packages/d3/f3/a444b5c21ef6dd7934b5f1639e5fc3f3b10bd7a5f70d3f2ff90314608429/node-0.9.13.tar.gz" } ], "0.9.14": [ { "comment_text": "", "digests": { "md5": "7b1f55d3b8b63acca9684062a36469ec", "sha256": "3d75b3a9dc9c9bdfb825c711edb4963f39694909c11967aeade3a2993b653bc7" }, "downloads": -1, "filename": "node-0.9.14.tar.gz", "has_sig": false, "md5_digest": "7b1f55d3b8b63acca9684062a36469ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44961, "upload_time": "2014-08-06T18:10:04", "url": "https://files.pythonhosted.org/packages/2d/59/1cf1275ed97e5baeaa2337b7206645e7183709c19a2889395b74bd7a3a27/node-0.9.14.tar.gz" } ], "0.9.15": [ { "comment_text": "", "digests": { "md5": "949f6670ee68be0075d68cd87a6fe2a4", "sha256": "2a7b69769720b2a2502bbf71b2755ae7bd9bccf9ad17c05e30d93e9adf56e214" }, "downloads": -1, "filename": "node-0.9.15.tar.gz", "has_sig": false, "md5_digest": "949f6670ee68be0075d68cd87a6fe2a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45025, "upload_time": "2014-12-17T14:13:00", "url": "https://files.pythonhosted.org/packages/44/3c/8c8b68a122a533ae4e553c151bf8508da561f7802b172b3aec5ac47b65d5/node-0.9.15.tar.gz" } ], "0.9.16": [ { "comment_text": "", "digests": { "md5": "0cb1be7faaea4f58be46393de01a8f7f", "sha256": "167089de7bc7a5793df9f161edc8fb6c1210728d71ef6960fcd1358b0e2c6114" }, "downloads": -1, "filename": "node-0.9.16.tar.gz", "has_sig": false, "md5_digest": "0cb1be7faaea4f58be46393de01a8f7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45877, "upload_time": "2015-10-08T08:47:21", "url": "https://files.pythonhosted.org/packages/5b/fd/b1c7bd6c77c4f65aedd14b40a50481ac562aeae0bb558e6420ce209c3544/node-0.9.16.tar.gz" } ], "0.9.16.dev0": [], "0.9.17": [ { "comment_text": "", "digests": { "md5": "5756e73bd273867a3af9e26c02e90c17", "sha256": "79f6c4d6218a71a3cdee7e7d86f5cb766814cd3e8f2cbde136dc7290715625d4" }, "downloads": -1, "filename": "node-0.9.17.tar.gz", "has_sig": false, "md5_digest": "5756e73bd273867a3af9e26c02e90c17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49555, "upload_time": "2017-01-17T16:00:22", "url": "https://files.pythonhosted.org/packages/93/7c/d1638b227db859cbfee59f864ae4f95059b15a2b406e2b97833595652dfa/node-0.9.17.tar.gz" } ], "0.9.18": [ { "comment_text": "", "digests": { "md5": "04b03c9a599d66878851c36bb344fb4f", "sha256": "6f41aa841a4ece3a33d5f33cfacd4c76e015ce1bd00bc67c1f07bd41c08e6615" }, "downloads": -1, "filename": "node-0.9.18.tar.gz", "has_sig": false, "md5_digest": "04b03c9a599d66878851c36bb344fb4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49586, "upload_time": "2017-02-14T10:27:48", "url": "https://files.pythonhosted.org/packages/be/86/bbd073a8f663fd416e234b2e8c4b137776bfca170e7207a3a9d31fd40c29/node-0.9.18.tar.gz" } ], "0.9.18.1": [ { "comment_text": "", "digests": { "md5": "e231ac8c7e6bfcf19fb93a703b04184c", "sha256": "e2dbc1c8934aa674b6954d116fa59e0fb91ba5f391c1b48a3c60b317f639b743" }, "downloads": -1, "filename": "node-0.9.18.1.tar.gz", "has_sig": false, "md5_digest": "e231ac8c7e6bfcf19fb93a703b04184c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49530, "upload_time": "2017-02-23T10:34:44", "url": "https://files.pythonhosted.org/packages/f5/1d/8c61da63547629977c10d791bad8274394f5e098388c7d2af563516456a7/node-0.9.18.1.tar.gz" } ], "0.9.19": [ { "comment_text": "", "digests": { "md5": "fb56b959a3c0edee79b917ba887f1836", "sha256": "5f69a440704ff126ca7c3ac1da541bf42303e9eeb1f586a7b3c209fba15c0d4f" }, "downloads": -1, "filename": "node-0.9.19.tar.gz", "has_sig": false, "md5_digest": "fb56b959a3c0edee79b917ba887f1836", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60158, "upload_time": "2017-06-07T10:38:03", "url": "https://files.pythonhosted.org/packages/cf/bb/d51cfa2ebaab6e7e1e9c6d2127a3dae3507058847d5ec80ca3a16f5356e5/node-0.9.19.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "2f9c213d7c7f9afbaef8c85f2727340a", "sha256": "f23b25ab7bbbaf08bc402d8729e71533752f01b3934afda2384cfdf858fc2448" }, "downloads": -1, "filename": "node-0.9.2.tar.gz", "has_sig": false, "md5_digest": "2f9c213d7c7f9afbaef8c85f2727340a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39753, "upload_time": "2011-03-16T19:25:22", "url": "https://files.pythonhosted.org/packages/16/77/36b00eefd81312aca3a52e0dc1ba26a0f0b0600e491a6ebbbe799e8de154/node-0.9.2.tar.gz" } ], "0.9.20": [ { "comment_text": "", "digests": { "md5": "81b53db38a833feed51dbda01ac6dda1", "sha256": "46c6ab7da12392f94b6a4afd2d9b8e1f722e3eb13317fb857387d5131c2f1404" }, "downloads": -1, "filename": "node-0.9.20.tar.gz", "has_sig": false, "md5_digest": "81b53db38a833feed51dbda01ac6dda1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60257, "upload_time": "2017-06-07T11:30:28", "url": "https://files.pythonhosted.org/packages/10/52/b03c5da3296278aaac465d2a6583ede8f28590738ce20cf22a1e8b61212f/node-0.9.20.tar.gz" } ], "0.9.21": [ { "comment_text": "", "digests": { "md5": "3f412a28855a70500c49a64d06296560", "sha256": "7dfc403a93428686df22032a202c5437ae17fac99e1abaa41420385f6f61eb9f" }, "downloads": -1, "filename": "node-0.9.21.tar.gz", "has_sig": false, "md5_digest": "3f412a28855a70500c49a64d06296560", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62771, "upload_time": "2017-06-15T11:52:54", "url": "https://files.pythonhosted.org/packages/05/41/d84c61cf997d2ad49597d405a3a4cb675eb6a0d3b4c488469fd6d704ed23/node-0.9.21.tar.gz" } ], "0.9.22": [ { "comment_text": "", "digests": { "md5": "3dacb0235050fed77f9c1539b1c8ceb4", "sha256": "0b7899d918d70be43e384f75c528c326efba69854fd5ca53731f06e714c59238" }, "downloads": -1, "filename": "node-0.9.22.tar.gz", "has_sig": false, "md5_digest": "3dacb0235050fed77f9c1539b1c8ceb4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 84647, "upload_time": "2017-07-18T08:23:36", "url": "https://files.pythonhosted.org/packages/87/22/8bb8df70210afbc57da040935573fe74d3a433700330f8e14e6d9bf8e16f/node-0.9.22.tar.gz" } ], "0.9.23": [ { "comment_text": "", "digests": { "md5": "e972eef3b468837a8b1f28fd4dfda199", "sha256": "931ebd66d37516af61fff76bee53efa8db4bee2a941f43b63b27275563e71a2f" }, "downloads": -1, "filename": "node-0.9.23.tar.gz", "has_sig": false, "md5_digest": "e972eef3b468837a8b1f28fd4dfda199", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 78186, "upload_time": "2018-11-07T07:37:08", "url": "https://files.pythonhosted.org/packages/71/10/bc89ea64784ebae2cfbb535cfb8ec11f95daa1f7a134ce4c99a29f6dd6e0/node-0.9.23.tar.gz" } ], "0.9.24": [ { "comment_text": "", "digests": { "md5": "4467e06b35cf321603cb1e505c47b683", "sha256": "f4d64c602418a42b1f55a7d578cad14fcfce2997cacab5fbe9ad6fac41793e3e" }, "downloads": -1, "filename": "node-0.9.24.tar.gz", "has_sig": false, "md5_digest": "4467e06b35cf321603cb1e505c47b683", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77840, "upload_time": "2019-07-10T08:46:19", "url": "https://files.pythonhosted.org/packages/80/38/22fe161e7431e3dd626e668876937a53a69df53a25574647cc485b757bbd/node-0.9.24.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "ae8c1f190f970222b6ca30521a5381e0", "sha256": "d9168504771aabb2f663720f866aa3682e0bb3efcf5584440515fdff6fa6f95e" }, "downloads": -1, "filename": "node-0.9.3.tar.gz", "has_sig": false, "md5_digest": "ae8c1f190f970222b6ca30521a5381e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46396, "upload_time": "2011-05-09T12:41:33", "url": "https://files.pythonhosted.org/packages/71/0b/b83c449c8a470b6af45a3e1eb9bff40af3eeb2f7859b8e6549edc8a9b7e7/node-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "bb03eafbdbb53f971f3eb006ae996fff", "sha256": "6e844e7aa65b1543b906f1386bf578a88ecad96fe872ea2b845728a13bb87f35" }, "downloads": -1, "filename": "node-0.9.4.tar.gz", "has_sig": false, "md5_digest": "bb03eafbdbb53f971f3eb006ae996fff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49283, "upload_time": "2011-08-05T20:58:28", "url": "https://files.pythonhosted.org/packages/60/26/bd6520b84d7a806d027fb7623a979479771b07ea9e4a8b65312715b5dd49/node-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "189c1bb3819308b26ca14243ba0f75f2", "sha256": "ab8f6940f6a6c9e8afff5a50fbf09099e274c67f9fec7fb0cfa4381cab6e5db7" }, "downloads": -1, "filename": "node-0.9.5.tar.gz", "has_sig": false, "md5_digest": "189c1bb3819308b26ca14243ba0f75f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51520, "upload_time": "2011-12-13T15:55:49", "url": "https://files.pythonhosted.org/packages/7f/02/a1febe9ceced887fe968d46a3806697b0501f860fe5138b14976e8bd3e9d/node-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "7929bee29560f410d3da4a0a3b6c2530", "sha256": "1ec7d022aa07caca49c96947a010cda833b682e0b9a4674641e846650c24e556" }, "downloads": -1, "filename": "node-0.9.6.tar.gz", "has_sig": false, "md5_digest": "7929bee29560f410d3da4a0a3b6c2530", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51782, "upload_time": "2012-03-20T10:26:22", "url": "https://files.pythonhosted.org/packages/91/4b/9381d18746031c589e0b45be5669c09cb774b14e3a79460d8c7a5046da80/node-0.9.6.tar.gz" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "4494cd8db882d38bcbf6268715a40b86", "sha256": "4e1d51a583f8ae55e74265464da58f8a60fcf9c41d08153c28ed885afff34568" }, "downloads": -1, "filename": "node-0.9.7.tar.gz", "has_sig": false, "md5_digest": "4494cd8db882d38bcbf6268715a40b86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44003, "upload_time": "2012-05-29T17:25:22", "url": "https://files.pythonhosted.org/packages/78/9e/f31de1556ed6b777c902605c774b14035c0f769ae0744d854c3c8b8ea107/node-0.9.7.tar.gz" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "837d285cce11ff8cf3d8101ce655e7b8", "sha256": "495f5b837d46be6c51af534df49f828a32b994d4e73c1b5bb6bc61c1e6ab143f" }, "downloads": -1, "filename": "node-0.9.8.tar.gz", "has_sig": false, "md5_digest": "837d285cce11ff8cf3d8101ce655e7b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44254, "upload_time": "2012-08-01T11:03:41", "url": "https://files.pythonhosted.org/packages/c5/32/331b46f5155190cc5f808c04c467d77e3cf4c916eba8e80f6eab13dbc188/node-0.9.8.tar.gz" } ], "0.9.9": [ { "comment_text": "", "digests": { "md5": "a98945b2fdbff19554b99ec543d96467", "sha256": "36e5ee3d32d6a00bb787b1dd206f6ca49955102a3422dc653da3e37e6bf02dbf" }, "downloads": -1, "filename": "node-0.9.9.tar.gz", "has_sig": false, "md5_digest": "a98945b2fdbff19554b99ec543d96467", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43619, "upload_time": "2012-10-17T15:46:17", "url": "https://files.pythonhosted.org/packages/7a/ba/6acd80e4084a4c681e3883b442619a3b55524a875085e1b356d11a7c093a/node-0.9.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4467e06b35cf321603cb1e505c47b683", "sha256": "f4d64c602418a42b1f55a7d578cad14fcfce2997cacab5fbe9ad6fac41793e3e" }, "downloads": -1, "filename": "node-0.9.24.tar.gz", "has_sig": false, "md5_digest": "4467e06b35cf321603cb1e505c47b683", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77840, "upload_time": "2019-07-10T08:46:19", "url": "https://files.pythonhosted.org/packages/80/38/22fe161e7431e3dd626e668876937a53a69df53a25574647cc485b757bbd/node-0.9.24.tar.gz" } ] }