{ "info": { "author": "Rob Phoenix", "author_email": "rob@robphoenix.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": ".. image:: https://raw.githubusercontent.com/robphoenix/diffios/master/docs/_static/logo.png\n :target: https://diffios.readthedocs.io/en/latest/\n\n\ndiffios is a Python library that provides a way to compare Cisco IOS configurations\nagainst a baseline template, and generate an output detailing the differences\nbetween them.\n\nWhere more traditional diff tools, such as Python's `difflib `_\nlibrary, consider lines independently and their order as important, diffios\nconsiders hierarchical configuration blocks independently and pays no mind to\nthe order of the lines, only whether they are present or not, in the same way a\nCisco device would.\n\nThis means we can declare our expectations in a baseline template, and then\ncompare our device configurations against it. diffios will generate an output\nwhich details where our device configurations differ from our expectations.\nFor elements we expect to vary, such as hostnames and IP addresses, diffios\nmakes use of variables, and will ignore pre-defined junk lines that bear no\nrelevance on our configuration.\n\nThe goal of diffios is to make the compliance auditing of large network estates\nmore manageable.\n\n\n.. image:: https://img.shields.io/travis/robphoenix/diffios.svg?style=flat-square\n :target: https://travis-ci.org/robphoenix/diffios\n\n.. image:: https://img.shields.io/pypi/v/diffios.svg?style=flat-square\n :target: https://pypi.python.org/pypi/diffios\n\n.. image:: https://img.shields.io/pypi/pyversions/diffios.svg?style=flat-square\n :target: https://pypi.python.org/pypi/diffios\n\n.. image:: https://img.shields.io/pypi/status/diffios.svg?style=flat-square\n :target: https://pypi.python.org/pypi/diffios\n\n.. image:: https://img.shields.io/coveralls/robphoenix/diffios.svg?style=flat-square\n :target: https://coveralls.io/github/robphoenix/diffios?branch=master\n\n.. image:: https://readthedocs.org/projects/diffios/badge/?version=latest&style=flat-square\n :target: http://diffios.readthedocs.io/en/latest/?badge=latest\n\nInstallation\n------------\n\nInstall via pip\n\n.. code:: bash\n\n pip install diffios\n\nUsage examples\n--------------\n\nWe'll need a baseline template that we expect all of our devices to conform to.\nThis can be any kind of text file, :code:`.txt`, :code:`.conf`, :code:`.cfg` or however\nyou store your device configuration files. It can also be a Python list if you\nwant.\n\nHere we have a simple **baseline.txt** file.\n\n.. code::\n\n version 15.3\n !\n hostname ABC{{ SITE_ID }}RT01\n !\n !\n ip domain name diffios.dev\n !\n username admin privilege 15 secret 5 {{ SECRET }}\n !\n interface Loopback0\n ip address {{ LOOPBACK_IP }} 255.255.255.255\n !\n !\n interface FastEthernet0/1\n description *** Link to Core ***\n ip address {{ FE_01_IP_ADDRESS }} 255.255.255.0\n duplex auto\n speed auto\n !\n interface FastEthernet0/2\n no ip address\n shutdown\n !\n interface Vlan100\n description User\n ip address {{ VLAN100_IP }} 255.255.255.0\n !\n interface Vlan200\n description Corporate\n ip address {{ VLAN200_IP }} 255.255.255.0\n no shutdown\n !\n !\n line vty 0 4\n exec-timeout 5 0\n login local\n transport input ssh\n transport output ssh\n !\n !\n end\n\nWithin this baseline file we can use variables, defined by the double curly\nbraces (:code:`{{ }}`), in place of changeable elements such as hostnames and\nIP addresses.\n\nWe can then collect the output from a show run command from the device we want\nto compare and save it in a file. Here we have a configuration file, **device_01.txt**,\nthat has a number of differences to our baseline.\n\n.. code::\n\n Building configuration...\n\n Current configuration : 1579 bytes\n !\n ! Last configuration change at 12:32:40 UTC Thu Oct 27 2016\n ! NVRAM config last updated at 16:10:30 UTC Tue Nov 8 2016 by admin\n version 15.3\n !\n hostname ABC12345RT01\n !\n !\n ip domain name diffios.dev\n !\n interface Loopback0\n ip address 192.168.100.1 255.255.255.255\n !\n !\n interface FastEthernet0/1\n description *** Link to Core ***\n ip address 192.168.0.1 255.255.255.128\n duplex auto\n speed auto\n !\n interface FastEthernet0/2\n ip address 192.168.0.2 255.255.255.0\n duplex auto\n speed auto\n !\n interface Vlan100\n description User\n ip address 10.10.10.1 255.255.255.0\n !\n interface Vlan300\n description Corporate\n ip address 10.10.10.2 255.255.255.0\n no shutdown\n !\n ip route 0.0.0.0 0.0.0.0 192.168.0.2\n !\n !\n line vty 0 4\n exec-timeout 5 0\n login local\n transport input telnet ssh\n transport output telnet ssh\n !\n !\n end\n\nDevice configurations can often contain junk lines that are going to show up as\ndifferences but that really we don't care about. Lines such as :code:`Building configuration...`.\n\nWe can add these lines to a separate file that we pass to diffios as a list of\nlines we'd like to ignore. Each line in this file will be evaluated as a regular\nexpression, so to match :code:`! NVRAM config last updated at 16:10:30 UTC Tue Nov 8 2016 by admin`\nwe only have to add something like :code:`NVRAM config last updated`.\n\nThis file can be named whatever you like, here we have quite sensibly named file\n*ignore.txt*. This can also be a regular Python list.\n\n.. code::\n\n Building configuration...\n Current configuration\n Last configuration change\n NVRAM config last updated\n\nSo, now that we have our configurations ready we can compare them.\n\n.. code:: python\n\n >>> import diffios\n >>>\n >>> baseline = \"baseline.txt\"\n >>> comparison = \"device_01.txt\"\n >>> ignore = \"ignore.txt\"\n >>>\n # We initialise a diffios Compare() object with our three files.\n # The ignore file is optional, and defaults to an empty list.\n >>> diff = diffios.Compare(baseline, comparison, ignore)\n # From this Compare object we can see the differences between our\n # configurations using the delta() method.\n >>> print(diff.delta())\n --- baseline\n +++ comparison\n\n 1. 1: interface FastEthernet0/1\n 2. ip address {{ FE_01_IP_ADDRESS }} 255.255.255.0\n 3. 2: interface FastEthernet0/2\n 4. no ip address\n 5. shutdown\n 6. 3: interface Vlan200\n 7. description Corporate\n 8. ip address {{ VLAN200_IP }} 255.255.255.0\n 9. no shutdown\n 10. 4: line vty 0 4\n 11. transport input ssh\n 12. transport output ssh\n 13. 5: username admin privilege 15 secret 5 {{ SECRET }}\n\n 14. 1: interface FastEthernet0/1\n 15. ip address 192.168.0.1 255.255.255.128\n 16. 2: interface FastEthernet0/2\n 17. ip address 192.168.0.2 255.255.255.0\n 18. duplex auto\n 19. speed auto\n 20. 3: interface Vlan300\n 21. description Corporate\n 22. ip address 10.10.10.2 255.255.255.0\n 23. no shutdown\n 24. 4: ip route 0.0.0.0 0.0.0.0 192.168.0.2\n 25. 5: line vty 0 4\n 26. transport input telnet ssh\n 27. transport output telnet ssh\n\nThe output above lists the lines of configuration that are missing from our\ndevice but that are present in our baseline template, shown by lines prefixed\nwith a :code:`-`. Lines that are present in our device that are not in our baseline\ntemplate are prefixed with a :code:`+`. Each block is numbered and listed in context\nwith it's parent line. Currently this output doesn't signify whether the parent\nline is part of the difference or only there to provide context.\n\nWe can also audit a large number of devices against a single baseline. Below is\nan example script that checks every file within a given directory against a\nbaseline and stores the differences in a CSV file.\n\n.. code:: python\n\n import os\n import csv\n\n import diffios\n\n IGNORE_FILE = os.path.join(os.getcwd(), \"ignores.txt\")\n COMPARISON_DIR = os.path.join(os.getcwd(), \"configs\", \"comparisons\")\n BASELINE_FILE = os.path.join(os.getcwd(), \"configs\", \"baselines\", \"baseline.txt\")\n\n # the CSV file we will write to\n output = os.path.join(os.getcwd(), \"diffs.csv\")\n\n with open(output, 'w') as csvfile:\n csvwriter = csv.writer(csvfile, lineterminator='\\n')\n # write the headers\n csvwriter.writerow([\"Comparison\", \"Baseline\", \"Additional\", \"Missing\"])\n files = sorted(os.listdir(COMPARISON_DIR))\n for f in files:\n comparison_file = os.path.join(COMPARISON_DIR, f)\n # initialise the diffios Compare object\n diff = diffios.Compare(BASELINE_FILE, comparison_file, IGNORE_FILE)\n csvwriter.writerow([\n f,\n os.path.basename(BASELINE_FILE),\n # write the formatted differences to the csv file\n diff.pprint_additional(),\n diff.pprint_missing()\n ])\n\nThe pretty print methods used above format the data in a more readable manner.\nWe can compare the output from the :code:`additional()` method and the\n:code:`pprint_additional()` method.\n\nThe :code:`additional()`, and :code:`missing()`, methods return a list of lists\nthat represent each block that contains a difference.\n\n.. code:: python\n\n >>> from pprint import pprint\n >>> pprint(diff.additional())\n [['interface FastEthernet0/1', ' ip address 192.168.0.1 255.255.255.128'],\n ['interface FastEthernet0/2',\n ' ip address 192.168.0.2 255.255.255.0',\n ' duplex auto',\n ' speed auto'],\n ['interface Vlan300',\n ' description Corporate',\n ' ip address 10.10.10.2 255.255.255.0',\n ' no shutdown'],\n ['ip route 0.0.0.0 0.0.0.0 192.168.0.2'],\n ['line vty 0 4',\n ' transport input telnet ssh',\n ' transport output telnet ssh']]\n\nWhereas the :code:`pprint_additional()` and :code:`print_missing()` methods return\nstrings that represent all the differences, with each block separated by a newline.\n\n.. code:: python\n\n >>> print(diff.pprint_additional())\n interface FastEthernet0/1\n ip address 192.168.0.1 255.255.255.128\n\n interface FastEthernet0/2\n ip address 192.168.0.2 255.255.255.0\n duplex auto\n speed auto\n\n interface Vlan300\n description Corporate\n ip address 10.10.10.2 255.255.255.0\n no shutdown\n\n ip route 0.0.0.0 0.0.0.0 192.168.0.2\n\n line vty 0 4\n transport input telnet ssh\n transport output telnet ssh\n\nDevelopment setup\n-----------------\n\nTo run the test suite\n\n.. code:: bash\n\n git clone https://github.com/robphoenix/diffios\n cd diffios\n # Here you may want to set up a virtualenv\n make init # this will install, via pip, test & documentation dependencies\n make test # run pytest with configuration options in setup.cfg\n\nContributing\n------------\n\nPlease read `CONTRIBUTING.md `_ for details on the code of conduct, and the process for submitting pull requests.\n\nAuthors\n-------\n\n* **Rob Phoenix** - *Initial work* - `robphoenix `_\n\nLicense\n-------\n\nThis project is licensed under the MIT License - see the `LICENSE `_ file for details\n\nLogo\n----\n\nArrows graphic by `Madebyoliver `_ from `Flaticon `_ is licensed under `CC BY 3.0 `_. Made with `Logo Maker `_.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/robphoenix/diffios", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "diffios", "package_url": "https://pypi.org/project/diffios/", "platform": "", "project_url": "https://pypi.org/project/diffios/", "project_urls": { "Homepage": "https://github.com/robphoenix/diffios" }, "release_url": "https://pypi.org/project/diffios/0.0.9/", "requires_dist": null, "requires_python": "", "summary": "Compare Cisco IOS configurations against a template.", "version": "0.0.9" }, "last_serial": 2678638, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3d1fc02a41f2224f4cde9592c6142b13", "sha256": "1125f639c3fa05397f4bee421af992b168881409335655c2aabdd898a1125dcd" }, "downloads": -1, "filename": "diffios-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3d1fc02a41f2224f4cde9592c6142b13", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9547, "upload_time": "2017-02-15T13:33:36", "url": "https://files.pythonhosted.org/packages/d1/35/251dbc3b422cd1e653b7451d910a3e34838f08e39c91696567b014a63f14/diffios-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec9b5066847276a39b7a189ef77c58ee", "sha256": "d4699bd6183f05b67352f0adf84e06fe20823d80a54a8bb544a0830e99561ab6" }, "downloads": -1, "filename": "diffios-0.0.1.tar.gz", "has_sig": false, "md5_digest": "ec9b5066847276a39b7a189ef77c58ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6666, "upload_time": "2017-02-15T13:33:37", "url": "https://files.pythonhosted.org/packages/3c/2c/dd21566df66892b076685df9a0f6486817aaa4b40c43201cc772a691a141/diffios-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "752d2a1ae97b3ff22b8fb38fc7927d79", "sha256": "99e05bf4ebc81b1c0b7a2dedf007da61e7f15fea40f47d747ee0f1ca1560dde3" }, "downloads": -1, "filename": "diffios-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "752d2a1ae97b3ff22b8fb38fc7927d79", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10788, "upload_time": "2017-02-15T16:08:37", "url": "https://files.pythonhosted.org/packages/51/13/f8af4153c7dbb3b813265014be563b3e698def1ec94bbb0f6c74c0ccdc1a/diffios-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e44df6752a91d87516902c1a50d187f", "sha256": "ad44e6936d57eba9441ebe15db0c8f0c0bf9d3a2390431f201bcb2fd1d1c9992" }, "downloads": -1, "filename": "diffios-0.0.2.tar.gz", "has_sig": false, "md5_digest": "5e44df6752a91d87516902c1a50d187f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7278, "upload_time": "2017-02-15T16:08:38", "url": "https://files.pythonhosted.org/packages/38/33/2ce9d77220009ad4ca87d802743b52152e252dd272541644904b8102bfcf/diffios-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "973e21676090e34cc49489b94eb8a35f", "sha256": "8f90e5a7d5e4ab188d75a982470977e59ee1467002ac8e0949e4e87c9b4b08ef" }, "downloads": -1, "filename": "diffios-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "973e21676090e34cc49489b94eb8a35f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10791, "upload_time": "2017-02-15T16:26:22", "url": "https://files.pythonhosted.org/packages/ad/83/0996bebad9cdd86f0201ab507c66b9db93aa58fa69946d738c8661e7e470/diffios-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7797b9b51dacbe55d2ceae8358d90343", "sha256": "480a39073898abaa06f91e10ad58f75233c7abeebd2224964c288ee41787f436" }, "downloads": -1, "filename": "diffios-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7797b9b51dacbe55d2ceae8358d90343", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7276, "upload_time": "2017-02-15T16:26:23", "url": "https://files.pythonhosted.org/packages/b8/90/925a5c0067c28a52823f5b41e1ed98131c8d5414babc85c1750f281bb729/diffios-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "27e140927c228d1c975b0352efd61b09", "sha256": "39d4f2a7981214b14ad76e89975b772d205f48e77dc47013500dfe0fba05b69a" }, "downloads": -1, "filename": "diffios-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "27e140927c228d1c975b0352efd61b09", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9242, "upload_time": "2017-02-15T16:40:44", "url": "https://files.pythonhosted.org/packages/1c/8b/9b0b02141d5f5e3b50593bfb2a0c93b4795af76f08f0e059641009192218/diffios-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d220f8e506fd878d8734e10c7d23c3d", "sha256": "802094233d524b4e2a0a35661a5222b049f70e4dbee7d278328a38f1b514c226" }, "downloads": -1, "filename": "diffios-0.0.4.tar.gz", "has_sig": false, "md5_digest": "2d220f8e506fd878d8734e10c7d23c3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6367, "upload_time": "2017-02-15T16:40:46", "url": "https://files.pythonhosted.org/packages/25/5d/fe7dc70371288374b3475ec68dd4dcc07c8c5bfe2fbf1b6e424a05aa2a7f/diffios-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "3fdb86dfa2d364444788ab9c6c96d2b0", "sha256": "941d8933c6419636b26bdaed81140e5f3282f4a42cb5cca06d5fec893e498b74" }, "downloads": -1, "filename": "diffios-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3fdb86dfa2d364444788ab9c6c96d2b0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7693, "upload_time": "2017-03-01T16:32:43", "url": "https://files.pythonhosted.org/packages/b9/cb/76e53ef81be7785076fb47560953b9a947fb25b7ab8b74c5683da8940c60/diffios-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a618647156f74f77c610b821bbb85976", "sha256": "558ec74ad4176671093f77e9eff3f9e4bd0a4235e8faa34089e7577ffcb19945" }, "downloads": -1, "filename": "diffios-0.0.5.tar.gz", "has_sig": false, "md5_digest": "a618647156f74f77c610b821bbb85976", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5629, "upload_time": "2017-03-01T16:32:45", "url": "https://files.pythonhosted.org/packages/ff/7d/8151bcfca299d85b11626fe8c15821c2cb1017f44ed99877d35d5545bc55/diffios-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "f8c277da8a031e3e629b71ddaf1d10f7", "sha256": "45a1bdd3d0e850df4364c510caec551ffe0ded9f3153f4c494ab55910f846eba" }, "downloads": -1, "filename": "diffios-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f8c277da8a031e3e629b71ddaf1d10f7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14668, "upload_time": "2017-03-02T17:02:30", "url": "https://files.pythonhosted.org/packages/3f/06/9feb56b4e35a18ed8799c6ee7f78a472952310b09d8e887ff18a1810525e/diffios-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ea4880c4596a0b1687d61502f1cb01f", "sha256": "9c5a80c38232b0113793d2a95935499cd4654a29f8f96e7ff322c4c884f71cd6" }, "downloads": -1, "filename": "diffios-0.0.6.tar.gz", "has_sig": false, "md5_digest": "2ea4880c4596a0b1687d61502f1cb01f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12430, "upload_time": "2017-03-02T17:02:32", "url": "https://files.pythonhosted.org/packages/56/41/bc2e2f2f20a37634a9dece433a038cbc50455bb52d526a59f3a512c39cd5/diffios-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "f8fdce8e4cf7b201e522b18ca2d641ae", "sha256": "0f16506cb058ecb686d9c3f558bac1de84fabad1360bd337814e7728c60fbc26" }, "downloads": -1, "filename": "diffios-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f8fdce8e4cf7b201e522b18ca2d641ae", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14688, "upload_time": "2017-03-02T17:05:19", "url": "https://files.pythonhosted.org/packages/d6/08/56c0c5efd9ca4f07d990e9d4e980abaa9beea6f9f9c4f4007ad111ab2b24/diffios-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a22610e3fd44f2c29d72e0066152719f", "sha256": "6bd178753007ec9b5eb1f5ba2f49086379f42846e8c2708bc41c0826891ffae9" }, "downloads": -1, "filename": "diffios-0.0.7.tar.gz", "has_sig": false, "md5_digest": "a22610e3fd44f2c29d72e0066152719f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12443, "upload_time": "2017-03-02T17:05:21", "url": "https://files.pythonhosted.org/packages/d0/35/5b1a194c8f4d835d3e07f1667b6f297e6b2c454fb96247188cbc5f74eb3a/diffios-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "cda31d86ac6ef6eeecbec0493a606230", "sha256": "f4d587d0c7747bfb027ac97650480fe98ccdca0afe0cd65ee9cdb6ed18e04a5d" }, "downloads": -1, "filename": "diffios-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cda31d86ac6ef6eeecbec0493a606230", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14722, "upload_time": "2017-03-02T17:07:15", "url": "https://files.pythonhosted.org/packages/87/f6/6bb6893bf131d1470a861724608032c6b0b7bf86fe6a2be1c2f5f9e379ac/diffios-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9be9cd9862d800ecb8508819e457cc80", "sha256": "8c03b6504b2fc38914f916a809a0d4fc3015c697eaab6c72f42dd0fb99661c1b" }, "downloads": -1, "filename": "diffios-0.0.8.tar.gz", "has_sig": false, "md5_digest": "9be9cd9862d800ecb8508819e457cc80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12482, "upload_time": "2017-03-02T17:07:19", "url": "https://files.pythonhosted.org/packages/66/38/d8f913533666f37eb3b8add1a7ebdef3a77bdb60563edc50a25b627be79b/diffios-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "1ccb6ea6f246d439a5e0c5c1d4ef94cf", "sha256": "a7d10cad6c22ffcfe593bf96cfc7401f24c656487c4e1ca6d8876eb305205b1d" }, "downloads": -1, "filename": "diffios-0.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1ccb6ea6f246d439a5e0c5c1d4ef94cf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14733, "upload_time": "2017-03-02T17:26:04", "url": "https://files.pythonhosted.org/packages/35/c5/235777fcfdbd2f62dab3e480607ecfdd7153bf2093db46e7affa6ebd7e60/diffios-0.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b56022277b6062c77857964cf6711227", "sha256": "5e5b460fca8d3694398747997a5e883149af0755fe298fc02784af951ef1ade4" }, "downloads": -1, "filename": "diffios-0.0.9.tar.gz", "has_sig": false, "md5_digest": "b56022277b6062c77857964cf6711227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12492, "upload_time": "2017-03-02T17:26:05", "url": "https://files.pythonhosted.org/packages/5a/ca/db4e7f5ec12d06416fbbff3d33491e774bc61d861908628c90cbec1c6f39/diffios-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1ccb6ea6f246d439a5e0c5c1d4ef94cf", "sha256": "a7d10cad6c22ffcfe593bf96cfc7401f24c656487c4e1ca6d8876eb305205b1d" }, "downloads": -1, "filename": "diffios-0.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1ccb6ea6f246d439a5e0c5c1d4ef94cf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14733, "upload_time": "2017-03-02T17:26:04", "url": "https://files.pythonhosted.org/packages/35/c5/235777fcfdbd2f62dab3e480607ecfdd7153bf2093db46e7affa6ebd7e60/diffios-0.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b56022277b6062c77857964cf6711227", "sha256": "5e5b460fca8d3694398747997a5e883149af0755fe298fc02784af951ef1ade4" }, "downloads": -1, "filename": "diffios-0.0.9.tar.gz", "has_sig": false, "md5_digest": "b56022277b6062c77857964cf6711227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12492, "upload_time": "2017-03-02T17:26:05", "url": "https://files.pythonhosted.org/packages/5a/ca/db4e7f5ec12d06416fbbff3d33491e774bc61d861908628c90cbec1c6f39/diffios-0.0.9.tar.gz" } ] }