{ "info": { "author": "Federico Capoano (nemesisdesign)", "author_email": "ninux-dev@ml.ninux.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Topic :: System :: Networking" ], "description": "netdiff\n=======\n\n.. image:: https://travis-ci.org/ninuxorg/netdiff.svg\n :target: https://travis-ci.org/ninuxorg/netdiff\n\n.. image:: https://coveralls.io/repos/ninuxorg/netdiff/badge.svg\n :target: https://coveralls.io/r/ninuxorg/netdiff\n\n.. image:: https://requires.io/github/ninuxorg/netdiff/requirements.svg?branch=master\n :target: https://requires.io/github/ninuxorg/netdiff/requirements/?branch=master\n :alt: Requirements Status\n\n.. image:: https://badge.fury.io/py/netdiff.svg\n :target: http://badge.fury.io/py/netdiff\n\n------------\n\nNetdiff is a simple Python library that provides utilities for parsing network topology\ndata of open source dynamic routing protocols and detecting changes in these topologies.\n\n**Current features**:\n\n* `parse different formats `_\n* `detect changes in two topologies `_\n* `return consistent NetJSON output `_\n* uses the popular `networkx `_ library under the hood\n\n**Goals**:\n\n* provide an abstraction layer to facilitate parsing different network topology formats\n* add support for the most popular dynamic open source routing protocols\n* facilitate detecting changes in network topology for monitoring purposes\n* provide standard `NetJSON`_ output\n* keep the library small with as few dependencies as possible\n\n**Currently used by**\n\n* `django-netjsongraph `_\n* `nodeshot `_\n\nInstall stable version from pypi\n--------------------------------\n\nInstall from pypi:\n\n.. code-block:: shell\n\n pip install netdiff\n\nInstall development version\n---------------------------\n\nInstall tarball:\n\n.. code-block:: shell\n\n pip install https://github.com/ninuxorg/netdiff/tarball/master\n\nAlternatively you can install via pip using git:\n\n.. code-block:: shell\n\n pip install -e git+git://github.com/ninuxorg/netdiff#egg=netdiff\n\nIf you want to contribute, install your cloned fork:\n\n.. code-block:: shell\n\n git clone git@github.com:/netdiff.git\n cd netdiff\n python setup.py develop\n\nBasic Usage Example\n-------------------\n\nCalculate diff of an OLSR 0.6.x topology:\n\n.. code-block:: python\n\n from netdiff import OlsrParser\n from netdiff import diff\n\n old = OlsrParser(file='./stored-olsr.json')\n new = OlsrParser(url='http://127.0.0.1:9090')\n diff(old, new)\n\nIn alternative, you may also use the subtraction operator:\n\n.. code-block:: python\n\n from netdiff import OlsrParser\n from netdiff import diff\n\n old = OlsrParser(file='./stored-olsr.json')\n new = OlsrParser(url='http://127.0.0.1:9090')\n old - new\n\nThe output will be an ordered dictionary with three keys:\n\n* added\n* removed\n* changed\n\nEach key will contain a dict compatible with the `NetJSON NetworkGraph format`_\nrepresenting respectively:\n\n* the nodes and links that have been added to the topology\n* the nodes and links that have been removed from the topology\n* links that are present in both topologies but their cost changed\n\nIf no changes are present, keys will contain ``None``.\n\nSo if between ``old`` and ``new`` there are no changes, the result will be:\n\n.. code-block:: python\n\n {\n \"added\": None\n \"removed\": None,\n \"changed\": None\n }\n\nWhile if there are changes, the result will look like:\n\n.. code-block:: python\n\n {\n \"added\": {\n \"type\": \"NetworkGraph\",\n \"protocol\": \"OLSR\",\n \"version\": \"0.6.6\",\n \"revision\": \"5031a799fcbe17f61d57e387bc3806de\",\n \"metric\": \"ETX\",\n \"nodes\": [\n {\n \"id\": \"10.150.0.7\"\n },\n {\n \"id\": \"10.150.0.6\"\n }\n ],\n \"links\": [\n {\n \"source\": \"10.150.0.3\",\n \"target\": \"10.150.0.7\",\n \"cost\": 1.50390625\n },\n {\n \"source\": \"10.150.0.3\",\n \"target\": \"10.150.0.6\",\n \"cost\": 1.0\n }\n ]\n },\n \"removed\": {\n \"type\": \"NetworkGraph\",\n \"protocol\": \"OLSR\",\n \"version\": \"0.6.6\",\n \"revision\": \"5031a799fcbe17f61d57e387bc3806de\",\n \"metric\": \"ETX\",\n \"nodes\": [\n {\n \"id\": \"10.150.0.8\"\n }\n ],\n \"links\": [\n {\n \"source\": \"10.150.0.7\",\n \"target\": \"10.150.0.8\",\n \"cost\": 1.0\n }\n ]\n },\n \"changed\": {\n \"type\": \"NetworkGraph\",\n \"protocol\": \"OLSR\",\n \"version\": \"0.6.6\",\n \"revision\": \"5031a799fcbe17f61d57e387bc3806de\",\n \"metric\": \"ETX\",\n \"nodes\": [],\n \"links\": [\n {\n \"source\": \"10.150.0.3\",\n \"target\": \"10.150.0.2\",\n \"cost\": 1.0\n }\n ]\n }\n }\n\nParsers\n-------\n\nParsers are classes that extend ``netdiff.base.BaseParser`` and implement a ``parse`` method\nwhich is in charge of converting a python data structure into ``networkx.Graph`` object and return the result.\n\nParsers also have a ``json`` method which returns valid `NetJSON output `_.\n\nThe available parsers are:\n\n* ``netdiff.OlsrParser``: parser for the `olsrd jsoninfo plugin `_\n or the older `txtinfo plugin `_\n* ``netdiff.BatmanParser``: parser for the `batman-advanced alfred tool `_\n (supports also the legacy txtinfo format inherited from olsrd)\n* ``netdiff.Bmx6Parser``: parser for the BMX6 `b6m tool `_\n* ``netdiff.CnmlParser``: parser for `CNML 0.1 `_\n* ``netdiff.NetJsonParser``: parser for the `NetJSON NetworkGraph format`_\n* ``netdiff.OpenvpnParser``: parser for the `OpenVPN status file `_\n\nInitialization arguments\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nData can be supplied in 3 different ways, in the following order of precedence:\n\n* ``data``: ``dict`` or ``str`` representing the topology/graph\n* ``url``: URL to fetch data from\n* ``file``: file path to retrieve data from\n\nOther available arguments:\n\n* **timeout**: integer representing timeout in seconds for HTTP or telnet requests, defaults to ``None``\n* **verify**: boolean indicating to the `request library whether to do SSL certificate\n verification or not `_\n\nInitialization examples\n~~~~~~~~~~~~~~~~~~~~~~~\n\nLocal file example:\n\n.. code-block:: python\n\n from netdiff import BatmanParser\n BatmanParser(file='./my-stored-topology.json')\n\nHTTP example:\n\n.. code-block:: python\n\n from netdiff import NetJsonParser\n url = 'https://raw.githubusercontent.com/interop-dev/netjson/master/examples/network-graph.json'\n NetJsonParser(url=url)\n\nTelnet example with ``timeout``:\n\n.. code-block:: python\n\n from netdiff import OlsrParser\n OlsrParser(url='telnet://127.0.1', timeout=5)\n\nHTTPS example with self-signed SSL certificate using ``verify=False``:\n\n.. code-block:: python\n\n from netdiff import NetJsonParser\n OlsrParser(url='https://myserver.mydomain.com/topology.json', verify=False)\n\nNetJSON output\n--------------\n\nNetdiff parsers can return a valid `NetJSON`_ ``NetworkGraph`` object:\n\n.. code-block:: python\n\n from netdiff import OlsrParser\n\n olsr = OlsrParser(url='telnet://127.0.0.1:9090')\n\n # will return a dict\n olsr.json(dict=True)\n\n # will return a JSON formatted string\n print(olsr.json(indent=4))\n\nOutput:\n\n.. code-block:: javascript\n\n {\n \"type\": \"NetworkGraph\",\n \"protocol\": \"OLSR\",\n \"version\": \"0.6.6\",\n \"revision\": \"5031a799fcbe17f61d57e387bc3806de\",\n \"metric\": \"ETX\",\n \"nodes\": [\n {\n \"id\": \"10.150.0.3\"\n },\n {\n \"id\": \"10.150.0.2\"\n },\n {\n \"id\": \"10.150.0.4\"\n }\n ],\n \"links\": [\n {\n \"source\": \"10.150.0.3\",\n \"target\": \"10.150.0.2\",\n \"cost\": 2.4\n },\n {\n \"source\": \"10.150.0.3\",\n \"target\": \"10.150.0.4\",\n \"cost\": 1.0\n }\n ]\n }\n\nExceptions\n----------\n\nAll the exceptions are subclasses of ``netdiff.exceptions.NetdiffException``.\n\nConversionException\n~~~~~~~~~~~~~~~~~~~\n\n``netdiff.exceptions.ConversionException``\n\nRaised when netdiff can't recognize the format passed to the parser.\n\nNot necessarily an error, should be caught and managed in order to support additional formats.\n\nThe data which was retrieved from network/storage can be accessed via the \"data\" attribute, eg:\n\n.. code-block:: python\n\n def to_python(self, data):\n try:\n return super(OlsrParser, self).to_python(data)\n except ConversionException as e:\n return self._txtinfo_to_jsoninfo(e.data)\n\nParserError\n~~~~~~~~~~~\n\n``netdiff.exceptions.ParserError``\n\nRaised when the format is recognized but the data is invalid.\n\nNetJsonError\n~~~~~~~~~~~~\n\n``netdiff.exceptions.NetJsonError``\n\nRaised when the ``json`` method of ``netdiff.parsers.BaseParser`` does not have enough data\nto be compliant with the `NetJSON NetworkGraph format`_ specification.\n\nTopologyRetrievalError\n~~~~~~~~~~~~~~~~~~~~~~\n\n``netdiff.exceptions.TopologyRetrievalError``\n\nRaised when it is not possible to retrieve the topology data\n(eg: the URL might be temporary unreachable).\n\nKnown Issues\n------------\n\nConnectionError: BadStatusLine\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf you get a similar error when performing a request to the `jsoninfo plugin `_ of\n`olsrd `_ (version 0.6 to 0.9) chances are high that http headers are disabled.\n\nTo fix it turn on http headers in your olsrd configuration file, eg::\n\n LoadPlugin \"olsrd_jsoninfo.so.0.0\"\n {\n PlParam \"httpheaders\" \"yes\" # add this line\n PlParam \"Port\" \"9090\"\n PlParam \"accept\" \"0.0.0.0\"\n }\n\nRunning tests\n-------------\n\nInstall your forked repo:\n\n.. code-block:: shell\n\n git clone git://github.com//netdiff\n cd netdiff/\n python setup.py develop\n\nInstall test requirements:\n\n.. code-block:: shell\n\n pip install -r requirements-test.txt\n\nRun tests with:\n\n.. code-block:: shell\n\n ./runtests.py\n\nAlternatively, you can use the ``nose`` command (which has a ton of available options):\n\n.. code-block:: shell\n\n nosetests\n nosetests tests.test_olsr # run only olsr related tests\n nosetests tests/test_olsr.py # variant form of the previous command\n nosetests tests.test_olsr:TestOlsrParser # variant form of the previous command\n nosetests tests.test_olsr:TestOlsrParser.test_parse # run specific test\n\nSee test coverage with:\n\n.. code-block:: shell\n\n coverage run --source=netdiff runtests.py && coverage report\n\nContributing\n------------\n\n1. Join the `ninux-dev mailing list`_\n2. Fork this repo and install it\n3. Follow `PEP8, Style Guide for Python Code`_\n4. Write code\n5. Write tests for your code\n6. Ensure all tests pass\n7. Ensure test coverage is not under 90%\n8. Document your changes\n9. Send pull request\n\n.. _PEP8, Style Guide for Python Code: http://www.python.org/dev/peps/pep-0008/\n.. _ninux-dev mailing list: http://ml.ninux.org/mailman/listinfo/ninux-dev\n.. _NetJSON NetworkGraph format: http://netjson.org/rfc.html#rfc.section.4\n.. _NetJSON: http://netjson.org\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/ninuxorg/netdiff/releases", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ninuxorg/netdiff", "keywords": "networking,mesh-network,netjson,olsr,batman,bmx", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "netdiff", "package_url": "https://pypi.org/project/netdiff/", "platform": "Platform Indipendent", "project_url": "https://pypi.org/project/netdiff/", "project_urls": { "Download": "https://github.com/ninuxorg/netdiff/releases", "Homepage": "https://github.com/ninuxorg/netdiff" }, "release_url": "https://pypi.org/project/netdiff/0.6/", "requires_dist": [ "six", "networkx (<2.1,>=2.0)", "requests (<3.0)", "libcnml (<0.10.0)", "openvpn-status (<0.3,>=0.2)" ], "requires_python": "", "summary": "Python library for parsing network topology data (eg: dynamic routing protocols, NetJSON, CNML) and detect changes.", "version": "0.6" }, "last_serial": 3444463, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "0b6943c10ed39503f28125fb97f9738e", "sha256": "702b90c2a3765fbe8e5894f964f09306bbc275a3b83def58837ab1146f0d19f0" }, "downloads": -1, "filename": "netdiff-0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0b6943c10ed39503f28125fb97f9738e", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 10901, "upload_time": "2015-05-02T19:05:16", "url": "https://files.pythonhosted.org/packages/b5/71/aa3c78d8931c3919b152f88e72602bd6a205e93a0a6eae82f67189fa8d1a/netdiff-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6b3d8f38767e8900333cb7a15d593998", "sha256": "f7d8948dffda307dea049e5c2bf8053a6faf2a989a3817f8890a4c78450795a5" }, "downloads": -1, "filename": "netdiff-0.1.tar.gz", "has_sig": true, "md5_digest": "6b3d8f38767e8900333cb7a15d593998", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26623, "upload_time": "2015-05-02T19:05:02", "url": "https://files.pythonhosted.org/packages/b2/6a/badcdb9bffd8a859dcbb38ae8f652fac11e9adaa8f7cfe95311f37ec0fb9/netdiff-0.1.tar.gz" } ], "0.1.alpha": [], "0.2": [ { "comment_text": "", "digests": { "md5": "582c4e6d5305de179cee6df8105b2039", "sha256": "3cc56c331bd0ed3e47b7fca06c44ef12c0b87805b5956d28372f31a563e1259a" }, "downloads": -1, "filename": "netdiff-0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "582c4e6d5305de179cee6df8105b2039", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 11597, "upload_time": "2015-05-08T11:07:13", "url": "https://files.pythonhosted.org/packages/5d/c9/7956ce44bdbc9299738a256ea7d4968c7845a07a6da86d19f07d1e0561cf/netdiff-0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4db3acbb033524d63e42b6dfc62dc27a", "sha256": "44277c62d93608a2eee1b9b852983b6aa925dae779f458b035a64cd02e9dbef1" }, "downloads": -1, "filename": "netdiff-0.2.tar.gz", "has_sig": true, "md5_digest": "4db3acbb033524d63e42b6dfc62dc27a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27293, "upload_time": "2015-05-08T11:07:10", "url": "https://files.pythonhosted.org/packages/bd/3e/639cb20d2841b889e7419c8dd2a60ca0be1664206ccd0a590a48f69e9735/netdiff-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "fddc2ace7811be3aa54f6e8b3538367c", "sha256": "b38dbf02f936ea5d7bdf426bf8572d2296744b71edee9a793e1f113b179ea1b1" }, "downloads": -1, "filename": "netdiff-0.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "fddc2ace7811be3aa54f6e8b3538367c", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 13326, "upload_time": "2015-05-15T11:55:53", "url": "https://files.pythonhosted.org/packages/2e/5b/6b856e040aea9673f61514357f6a1b62de35150ac894f297de2ea2bab3d9/netdiff-0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93f4d3db83803240f81cb9d20d5ef5d4", "sha256": "0503f14d8041c4433cdf1294327930fa882d8ec33b2905799b8da92c34a1d7a4" }, "downloads": -1, "filename": "netdiff-0.3.tar.gz", "has_sig": true, "md5_digest": "93f4d3db83803240f81cb9d20d5ef5d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64235, "upload_time": "2015-05-15T11:55:50", "url": "https://files.pythonhosted.org/packages/4f/8e/9b28b657f5a39737ec6d200546ac0e35b8a5671972d035fcd3b069cebe89/netdiff-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "3a13ecbbe42ef2be34627cc3621434d5", "sha256": "b4a45e61cb3cbeed5270a0aca2446cb0970c0bddb7d625c8cb5d4abb21dc7645" }, "downloads": -1, "filename": "netdiff-0.3.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3a13ecbbe42ef2be34627cc3621434d5", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 13580, "upload_time": "2015-05-22T14:37:59", "url": "https://files.pythonhosted.org/packages/a0/37/ad206245e5173bbd7a19b5f5ef93dda7346550f9174b1bce5696377bed99/netdiff-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "995d13ff741670f1082e6b02ace267df", "sha256": "1696a3aff4c2848d295f386864f83876e5a6cf478cbbe369d3248c0727c7f73f" }, "downloads": -1, "filename": "netdiff-0.3.1.tar.gz", "has_sig": true, "md5_digest": "995d13ff741670f1082e6b02ace267df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66155, "upload_time": "2015-05-22T14:37:55", "url": "https://files.pythonhosted.org/packages/01/d5/721eece6fc6137c62de4b756bf43ebfd0b29fce6e847c230cf100636068a/netdiff-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "ef568d69bc691ee72242e6b596843a78", "sha256": "4ad5733abec0b210b5600c7066b1bad1d112e97beaef09f1438b86959c13b5c9" }, "downloads": -1, "filename": "netdiff-0.3.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "ef568d69bc691ee72242e6b596843a78", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 15233, "upload_time": "2015-06-03T16:43:19", "url": "https://files.pythonhosted.org/packages/87/27/32d1d3e582c950c562757fbed76dc2ffc761e76f610830ce478f658e766e/netdiff-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e163641c8d6c912369a3f563df18f23a", "sha256": "08eb39aaee5ae3d2e12be9a3bebbb538147299e9d3fb410464dac79fc29515cf" }, "downloads": -1, "filename": "netdiff-0.3.2.tar.gz", "has_sig": true, "md5_digest": "e163641c8d6c912369a3f563df18f23a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66147, "upload_time": "2015-06-03T16:43:16", "url": "https://files.pythonhosted.org/packages/53/95/7bc2fcf7654856a8cba76c1086f94adc9bc996b0354d94f534c6513f326b/netdiff-0.3.2.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "72ab33f7838c03370ebd3bd024da8017", "sha256": "f87f37492d8cee33acd5cff4fa71565271dca80d35e06ff846514abaca1be3fb" }, "downloads": -1, "filename": "netdiff-0.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "72ab33f7838c03370ebd3bd024da8017", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 17097, "upload_time": "2015-06-14T14:32:40", "url": "https://files.pythonhosted.org/packages/9f/4b/37e654ee80f56b60261fd047a64d5c93bf76281f847f4d852d643150b6ea/netdiff-0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3194e8c3c04dc729077ffe19367ab872", "sha256": "c0901b844f557429ff4905e70e46c66eed4e6cbb03f60f6f605adb615c616eea" }, "downloads": -1, "filename": "netdiff-0.4.tar.gz", "has_sig": true, "md5_digest": "3194e8c3c04dc729077ffe19367ab872", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 70202, "upload_time": "2015-06-14T14:32:36", "url": "https://files.pythonhosted.org/packages/30/bd/d8c751ebbc09bf0436447c420c0d002f91014001b5a5e7152694be1716d7/netdiff-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "09a4bc510adda9b0349b28db1de08589", "sha256": "5bf893bf44dfef157e9b2951f0c3f6de9dd57ac227d1aaaeb01d5f867726d4e8" }, "downloads": -1, "filename": "netdiff-0.4.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "09a4bc510adda9b0349b28db1de08589", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17845, "upload_time": "2015-06-26T18:14:12", "url": "https://files.pythonhosted.org/packages/62/4a/35b7ef0bb5f84d29950e1ba794619053957b58d4be309dfe039d3407cc5d/netdiff-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3b57ad766a9050420ca0fa93fb848c6", "sha256": "fa8f46d7499d90d951391504114a4efd023b621a422453d5ad40d8b2dae68ae2" }, "downloads": -1, "filename": "netdiff-0.4.1.tar.gz", "has_sig": true, "md5_digest": "a3b57ad766a9050420ca0fa93fb848c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 71730, "upload_time": "2015-06-26T18:14:08", "url": "https://files.pythonhosted.org/packages/95/73/df9f81652837b330d8b03f57c7921c29e204a63a0a57daea9bfa9e62358a/netdiff-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "b2de8177e17a4610430fb88d51627fd2", "sha256": "189cc341441f3df0a7b55c66d719b26d3cc603f727249fd2dc93b5f7d4dd7875" }, "downloads": -1, "filename": "netdiff-0.4.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b2de8177e17a4610430fb88d51627fd2", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 17883, "upload_time": "2015-06-27T16:57:26", "url": "https://files.pythonhosted.org/packages/66/ec/6fb675f8faae6ea39fd5d43060a32b2e08e9301b4c2ce25c8289629fa6db/netdiff-0.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c9a6179580af60d2c053370bb447cd6", "sha256": "59e9ecbfa338d9ddacb7ade98f036871863aba7ef3baff2f9c28b8b850bb96a6" }, "downloads": -1, "filename": "netdiff-0.4.2.tar.gz", "has_sig": true, "md5_digest": "5c9a6179580af60d2c053370bb447cd6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 71872, "upload_time": "2015-06-27T16:57:21", "url": "https://files.pythonhosted.org/packages/ae/a2/1354d24300d1b5200edc151679eac9ce276b8393ff41d365d5a0e89cab03/netdiff-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "0911d65c54794dc1fdefb53c3eb1d7db", "sha256": "743f08958869aac8f538318cefdfff09ffdef4a04cc7c9bc4046c6d63d5179e6" }, "downloads": -1, "filename": "netdiff-0.4.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0911d65c54794dc1fdefb53c3eb1d7db", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18598, "upload_time": "2015-07-02T08:07:18", "url": "https://files.pythonhosted.org/packages/df/9b/adb8e7b404343cfb3fd9b17bf60b340e8db47175260aee39ab2b05d69e60/netdiff-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5739336944ff8b085cb744af10e7e7fd", "sha256": "a39f48f9a9abf43b5786f61602136889decdaad3f274ac6b774cf69ebfcf978f" }, "downloads": -1, "filename": "netdiff-0.4.3.tar.gz", "has_sig": true, "md5_digest": "5739336944ff8b085cb744af10e7e7fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73022, "upload_time": "2015-07-02T08:07:14", "url": "https://files.pythonhosted.org/packages/60/a1/cc08e9b8430e6baf6905b476d6e88a925d787ab3b794d7536ea6c9ae0397/netdiff-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "85c3f3f683dfbb034b3cc8be760bb1b3", "sha256": "e1afcecaf2e55aefaedb6507e5926f2a36ce05186b7e6880f7c7bedbf3cda2a2" }, "downloads": -1, "filename": "netdiff-0.4.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "85c3f3f683dfbb034b3cc8be760bb1b3", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18619, "upload_time": "2015-09-06T19:18:20", "url": "https://files.pythonhosted.org/packages/a2/86/217bc4389a62cdd12903d5e88e88f044644b555556c2235a81b3c1d9f53c/netdiff-0.4.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b32f84aac950f8a6a610a3da212a65f", "sha256": "b607809aae709f72efb94029e82d170ffd8aabc74c6005dbc274817ec36b6b45" }, "downloads": -1, "filename": "netdiff-0.4.4.tar.gz", "has_sig": true, "md5_digest": "4b32f84aac950f8a6a610a3da212a65f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73092, "upload_time": "2015-09-06T19:18:14", "url": "https://files.pythonhosted.org/packages/f0/0a/bdcffd22cf6c22d2391d383880ac6b1e19c100bbed3634dc19cf633586e7/netdiff-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "c2a5c8981abfc555ac8f2b1c590867ef", "sha256": "25c5d16211ec88482e2f6f9969a6fd93a697540655632cd4b0ba0d7bf4372fcf" }, "downloads": -1, "filename": "netdiff-0.4.5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "c2a5c8981abfc555ac8f2b1c590867ef", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 19726, "upload_time": "2015-09-28T10:08:20", "url": "https://files.pythonhosted.org/packages/94/0c/9a3769c94e7be2039e86a343a1d5a70e198ea4c77ecb72c63c955ed8bdd5/netdiff-0.4.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "449fadac4db7081876c277e52352031c", "sha256": "84b488c564d880c7ec557663337c3d6841bc9accf95d2589b88f55cec5723ef4" }, "downloads": -1, "filename": "netdiff-0.4.5.tar.gz", "has_sig": true, "md5_digest": "449fadac4db7081876c277e52352031c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 76110, "upload_time": "2015-09-28T10:08:06", "url": "https://files.pythonhosted.org/packages/a5/64/fa3696ca721ffc565ee3d63ef7ec83c6f83e8c22a34b406ec43948444864/netdiff-0.4.5.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "a808a0cdd08c1a87aa4cb7a41c26d2fa", "sha256": "19b5703db63bc20dac091ae5ead172db62e78955e63e1b3f22fe46f0b6f162e7" }, "downloads": -1, "filename": "netdiff-0.4.6-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a808a0cdd08c1a87aa4cb7a41c26d2fa", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 20114, "upload_time": "2015-12-27T17:34:18", "url": "https://files.pythonhosted.org/packages/25/24/3e10bc59a418a9bcda494df7f37a90e6d97b4e2bb5134ae559f2dbd8cb25/netdiff-0.4.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56e537f5e2194f213e0cb627d308c543", "sha256": "9373abbf5bc98fae16d7e9f3fe222185b5742f433190b4898fcbb992f4171ed3" }, "downloads": -1, "filename": "netdiff-0.4.6.tar.gz", "has_sig": true, "md5_digest": "56e537f5e2194f213e0cb627d308c543", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63071, "upload_time": "2015-12-27T17:34:08", "url": "https://files.pythonhosted.org/packages/bc/9a/4cfe334279b37a86d0a4c43af01c0ecbc7164c4f544eb32afc28bc82d977/netdiff-0.4.6.tar.gz" } ], "0.4.7": [ { "comment_text": "", "digests": { "md5": "2be2f07d8efb76762c87569a80b17656", "sha256": "6347cd97c5f519055b2f60711cae478e39f76ce9858105fecf4d9388d8d099a0" }, "downloads": -1, "filename": "netdiff-0.4.7-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "2be2f07d8efb76762c87569a80b17656", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 20092, "upload_time": "2016-01-04T16:21:33", "url": "https://files.pythonhosted.org/packages/58/ad/ad9a264b653f018f3c053f74454a793c8bd53c6c5b7cd2ec4891139e672c/netdiff-0.4.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "725bfec3d4d4453f6b75c2f03b2e8966", "sha256": "44755bdddd19908ba3473a39109014147961a37950dd404728cf9422b5f33c22" }, "downloads": -1, "filename": "netdiff-0.4.7.tar.gz", "has_sig": true, "md5_digest": "725bfec3d4d4453f6b75c2f03b2e8966", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63078, "upload_time": "2016-01-04T16:21:11", "url": "https://files.pythonhosted.org/packages/ab/fe/c3947b474b6853855ccb1c034a6328f8676a23425eb90ff7cd7dd92ea71d/netdiff-0.4.7.tar.gz" } ], "0.4.8": [ { "comment_text": "", "digests": { "md5": "48b6ef5039c7ee2518622d30a47448c9", "sha256": "d20b5375a218b9b92f34e1e664e3d9012748ae97ac8042cb42d32877006ca268" }, "downloads": -1, "filename": "netdiff-0.4.8-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "48b6ef5039c7ee2518622d30a47448c9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20089, "upload_time": "2017-08-30T09:27:36", "url": "https://files.pythonhosted.org/packages/b7/67/d7d3d0b90f6c3d9854db7f01c98e0dc3b2a2d8212230c54c6a4a501be24e/netdiff-0.4.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "37a7bab8a2a82556ee2a54ebe6970109", "sha256": "9dab33a5ed59c72d0d3b8ace7a4d1840c8a64b60a9849a196606671e710f5bd7" }, "downloads": -1, "filename": "netdiff-0.4.8.tar.gz", "has_sig": true, "md5_digest": "37a7bab8a2a82556ee2a54ebe6970109", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64923, "upload_time": "2017-08-30T09:27:39", "url": "https://files.pythonhosted.org/packages/47/fd/f5cdea5ecbfa97d2a043de45821fc6ba37516f29158a990c794862f1ee93/netdiff-0.4.8.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "22548b290ccadb0d276a1add9db3a303", "sha256": "b2f3ff38278615657c19d32ee7b9561aec981c4f1ebd742dcb4769ce0fd4984c" }, "downloads": -1, "filename": "netdiff-0.5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "22548b290ccadb0d276a1add9db3a303", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20085, "upload_time": "2017-08-30T10:42:51", "url": "https://files.pythonhosted.org/packages/fc/ab/539b53e18378afd003e16271c854d73d450e5f0c6b3e95e07236fcb13ce9/netdiff-0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9391bb55119fdbc8a8547a6c07b863d7", "sha256": "ad92de3884d534f70589244833f595474797251cba1263574c42a92201a7d0e1" }, "downloads": -1, "filename": "netdiff-0.5.tar.gz", "has_sig": true, "md5_digest": "9391bb55119fdbc8a8547a6c07b863d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65041, "upload_time": "2017-08-30T10:42:53", "url": "https://files.pythonhosted.org/packages/45/ad/ead331c654b3c59f52560dff957cdb7ee85e8279a15e4f1bc744a4977803/netdiff-0.5.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "5e4911c26c44fae8e8b2b1289ba36a5c", "sha256": "03c1aa89bed1cf9adfff11b9f86b265e9059dd5404f00113a5e42cf0aacd2e3c" }, "downloads": -1, "filename": "netdiff-0.5.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "5e4911c26c44fae8e8b2b1289ba36a5c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20950, "upload_time": "2017-09-29T17:38:26", "url": "https://files.pythonhosted.org/packages/ab/60/5017fb62087b18fea89235837adc1294c7bf736a88f47736d6ad5439d5d4/netdiff-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3dee5e0ea401d4a692023b2cb442782f", "sha256": "9c330852bf909baa742ff0ef9106b4136f43ccc51345f564bab9b2c4522823f7" }, "downloads": -1, "filename": "netdiff-0.5.1.tar.gz", "has_sig": true, "md5_digest": "3dee5e0ea401d4a692023b2cb442782f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19655, "upload_time": "2017-09-29T17:38:27", "url": "https://files.pythonhosted.org/packages/22/26/7a8943f3926cea8bd1d6c9c11f29b7ab1960dbc50b8c63f93c8b15a63ffe/netdiff-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "a3a657daeac4145ddd63d1ad1296cf49", "sha256": "4ad36b23a421fae2b0e84797d33aedd5638c9b58a5e71e8bc870cb08589450a9" }, "downloads": -1, "filename": "netdiff-0.5.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a3a657daeac4145ddd63d1ad1296cf49", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21187, "upload_time": "2017-12-25T20:26:59", "url": "https://files.pythonhosted.org/packages/58/48/00af7a1ed8d0f090aec72672149373bba4e9f69883f3a4e2ff90045fe484/netdiff-0.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c91688dcec2360b2208f316606536f79", "sha256": "fa7de487b92dc37aeeb9ef058d8136aeb13d4dfbe78e3d49db5f9dee8a8e7277" }, "downloads": -1, "filename": "netdiff-0.5.2.tar.gz", "has_sig": true, "md5_digest": "c91688dcec2360b2208f316606536f79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20019, "upload_time": "2017-12-25T20:27:10", "url": "https://files.pythonhosted.org/packages/82/e7/7f60fa5e68b51bd888754494ef9a67ae8b932dde3ea623557a87a4012514/netdiff-0.5.2.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "b4fe86162230f1f9fc92e5c884a84830", "sha256": "e18d6d2588df770e6c55b99d62a51b108cc7f70bc8bcd85ce85fb3dcac4a380e" }, "downloads": -1, "filename": "netdiff-0.6-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b4fe86162230f1f9fc92e5c884a84830", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21258, "upload_time": "2017-12-27T04:42:20", "url": "https://files.pythonhosted.org/packages/aa/8d/d39d32c4e5de5a41b2d04426abd8cc16efc34b72af25894f100946f7484e/netdiff-0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5395fd603c8098cd90fa968159c130e7", "sha256": "bbf4c2fdc6d50d5a0d1f6b84132ba4e206e8084812257d617225258bf48ad04b" }, "downloads": -1, "filename": "netdiff-0.6.tar.gz", "has_sig": true, "md5_digest": "5395fd603c8098cd90fa968159c130e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20243, "upload_time": "2017-12-27T04:42:28", "url": "https://files.pythonhosted.org/packages/e7/bf/b5f11ab69121dc458ceff544493dfe4a0c74d2c3f78f17f57aae8e6a9064/netdiff-0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b4fe86162230f1f9fc92e5c884a84830", "sha256": "e18d6d2588df770e6c55b99d62a51b108cc7f70bc8bcd85ce85fb3dcac4a380e" }, "downloads": -1, "filename": "netdiff-0.6-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b4fe86162230f1f9fc92e5c884a84830", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21258, "upload_time": "2017-12-27T04:42:20", "url": "https://files.pythonhosted.org/packages/aa/8d/d39d32c4e5de5a41b2d04426abd8cc16efc34b72af25894f100946f7484e/netdiff-0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5395fd603c8098cd90fa968159c130e7", "sha256": "bbf4c2fdc6d50d5a0d1f6b84132ba4e206e8084812257d617225258bf48ad04b" }, "downloads": -1, "filename": "netdiff-0.6.tar.gz", "has_sig": true, "md5_digest": "5395fd603c8098cd90fa968159c130e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20243, "upload_time": "2017-12-27T04:42:28", "url": "https://files.pythonhosted.org/packages/e7/bf/b5f11ab69121dc458ceff544493dfe4a0c74d2c3f78f17f57aae8e6a9064/netdiff-0.6.tar.gz" } ] }