{ "info": { "author": "Christoph Schueler", "author_email": "cpu12.gems@googlemail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Scientific/Engineering", "Topic :: Software Development" ], "description": "\nobjutils\n========\n\n.. image:: https://codeclimate.com/github/christoph2/objutils/badges/gpa.svg\n :target: https://codeclimate.com/github/christoph2/objutils\n\n.. image:: https://coveralls.io/repos/github/christoph2/objutils/badge.svg?branch=master\n :target: https://coveralls.io/github/christoph2/objutils?branch=master\n\n.. image:: https://github.com/christoph2/objutils/workflows/objutils/badge.svg\n :target: https://github.com/christoph2/objutils\n\n.. image:: https://ci.appveyor.com/api/projects/status/owpi324b6wbwocq9?svg=true\n :target: https://ci.appveyor.com/project/christoph2/objutils\n\n.. image:: https://results.pre-commit.ci/badge/github/christoph2/objutils/master.svg\n :target: https://results.pre-commit.ci/latest/github/christoph2/objutils/master\n :alt: pre-commit.ci status\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n\n.. image:: http://img.shields.io/badge/license-GPL-blue.svg\n :target: http://opensource.org/licenses/GPL-2.0\n\n\nBinary data stored in hex-files is in widespread use especially in embedded systems applications.\n``objutils`` gives you programmatic access to a wide array of formats and offers an practical API\nto work with such data.\n\nGet the latest version from `Github `_\n\n\nInstallation\n------------\n\n.. code-block:: shell\n\n pip install objutils\n\nor run\n\n.. code-block:: shell\n\n python setup.py develop\n\non your local installation.\n\nPrerequisites\n-------------\n\n- Python >= 3.4\n\nFeatures\n--------\n\n- ELF files could read, including symbols.\n- Typified access (scalar and arrays) to binaray data.\n\nSupported HEX formats\n^^^^^^^^^^^^^^^^^^^^^\n``objutils`` supports a bunch of HEX formats...\n\nCurrent\n~~~~~~~\n\n- codec / format name\n\n* ihex (Intel HEX)\n* shf (S Hexdump (`rfc4194 `_))\n* srec (Motorola S-Records)\n* titxt (Texas Instruments Text)\n\nHistorical\n~~~~~~~~~~\n\n- codec / format name\n\n* ash (ASCII Space Hex)\n* cosmac (RCA Cosmac)\n* emon52 (Elektor EMON52)\n* etek (Tektronix Extended Hexadecimal)\n* fpc (Four Packed Code)\n* mostec (MOS Technology)\n* rca (RCA)\n* sig (Signetics)\n* tek (Tektronix Hexadecimal)\n\n**codec** is the first parameter to dump() / load() functions, e.g.:\n\n.. code-block:: python\n\n img = objutils.load(\"ihex\", \"myHexFile.hex\") # Load an Intel HEX file...\n objutils.dump(\"srec\", \"mySRecFile.srec\", img) # and save it as S-Records.\n\nFirst steps\n-----------\n\nIf you are interested, what ``objutils`` provides to you out-of-the-box, refer to `Scripts `_ documentation.\n\nIn any case, you should work through the following tutorial:\n\nFirst import all classes and functions used in this tutorial.\n\n.. code-block:: python\n\n from objutils import Image, Section, dump, dumps, load, loads\n\nEverything starts with hello world...\n\n.. code-block:: python\n\n sec0 = Section(start_address = 0x1000, data = \"Hello HEX world!\")\n\nThe constructor parameters to `Section` reflect what they are about:\nA continuous area of memory with an start address.\n\n**data** is not necessarily a string, **array.array**s, **byte**, **bytearray** will also do,\nor from an internal point of view: everything that is convertible to **bytearray** could be used.\n\nNote: **start_address** and **data** are positional arguments, so there is no need to use them as keywords (just for the sake of illustration).\n\n\nNow let's inspect our section.\n\n.. code-block:: python\n\n sec0.hexdump()\n\n 00001000 48 65 6c 6c 6f 20 48 45 58 20 77 6f 72 6c 64 21 |Hello HEX world!|\n ---------------\n 16 bytes\n ---------------\n\n**hexdump()** gives us, what in the world of hackers is known as a canonical hexdump.\n\nHEX files usually consist of more than one section, so let's create another one.\n\n.. code-block:: python\n\n sec1 = Section(0x2000, range(1, 17))\n sec1.hexdump()\n\n 00002000 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 |................|\n ---------------\n 16 bytes\n ---------------\n\nNow, let's glue together our sections.\n\n.. code-block:: python\n\n img0 = Image([sec0, sec1])\n print(img0)\n\n Section(address = 0X00001000, length = 16, data = b'Hello HEX world!')\n Section(address = 0X00002000, length = 16, data = b'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10')\n\n\nImages are obviously a container for sections, and they are always involved if you are interacting with disk based HEX files.\n\n.. code-block:: python\n\n dump(\"srec\", \"example0.srec\", img0)\n\nThe resulting file could be inspected from command line.\n\n.. code-block:: shell\n\n $ cat example0.srec\n S113100048656C6C6F2048455820776F726C64217A\n S11320000102030405060708090A0B0C0D0E0F1044\n\n\nAnd loaded again...\n\n.. code-block:: python\n\n img1 = load(\"srec\", \"example0.srec\")\n print(img1)\n\n Section(address = 0X00001000, length = 16, data = b'Hello HEX world!')\n Section(address = 0X00002000, length = 16, data = b'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10')\n\nThis leads to the conversion idiom.\n\n.. code-block:: python\n\n img1 = load(\"srec\", \"example0.srec\")\n dump(\"ihex\", \"example0.hex\", img1)\n\n\nNote: the formats above listed as historical are for one good reason historical: they are only 16bit wide, so if you want to convert,\nsay a **srec** file for a 32bit MCU to them, you're out of luck.\n\nOK, we're starting another session.\n\n.. code-block:: python\n\n sec0 = Section(0x100, range(1, 9))\n sec1 = Section(0x108, range(9, 17))\n img0 = Image([sec0, sec1])\n print(img0)\n\n Section(address = 0X00000100, length = 16, data = b'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10')\n\n img0.hexdump()\n\n Section #0000\n -------------\n 00000100 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 |................|\n ---------------\n 16 bytes\n ---------------\n\nTwo sections with consecutive address ranges concatenated to one, this may or may not what you are expected.\n\nFor this reason **Image** has a **join** parameter.\n\n.. code-block:: python\n\n sec0 = Section(0x100, range(1, 9))\n sec1 = Section(0x108, range(9, 17))\n img0 = Image([sec0, sec1], join = False)\n print(img0)\n\n Section(address = 0X00000100, length = 8, data = b'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08')\n Section(address = 0X00000108, length = 8, data = b'\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10')\n\n img0.hexdump()\n\n Section #0000\n -------------\n 00000100 01 02 03 04 05 06 07 08 |........ |\n ---------------\n 8 bytes\n ---------------\n\n Section #0001\n -------------\n 00000108 09 0a 0b 0c 0d 0e 0f 10 |........ |\n ---------------\n 8 bytes\n ---------------\n\n\nOne feature that sets **objutils** apart from other libraries of this breed is typified access.\n\nWe are starting with a new image.\n\n.. code-block:: python\n\n img0 = Image([Section(0x1000, bytes(64))])\n print(img0)\n\n Section(address = 0X00001000, length = 64, data = b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00...00\\x00\\x00\\x00\\x00\\x00\\x00\\x00')\n\nWe are now writing a string to our image.\n\n.. code-block:: python\n\n img0 = Image([Section(0x1000, bytes(64))])\n img0.write(0x1010, [0xff])\n img0.hexdump()\n\n Section #0000\n -------------\n 00001000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n 00001010 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n 00001020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n 00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n\n img0.write_string(0x1000, \"Hello HEX world!\")\n img0.hexdump()\n\n Section #0000\n -------------\n 00001000 48 65 6c 6c 6f 20 48 45 58 20 77 6f 72 6c 64 21 |Hello HEX world!|\n 00001010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n *\n 00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n ---------------\n 64 bytes\n ---------------\n\nNotice the difference? In our **Section** example above, the string passed as a **data** parameter\nwas just a bunch of bytes, but now it is a \"real\" C-string (there is a opposite function, **read_string**, \nthat scans for a terminating **NULL** character).\n\nUse **write()** and **read()** functions, if you want to access plain bytes.\n\nBut there is also support for numerical types.\n\n.. code-block:: python\n\n img0 = Image([Section(0x1000, bytes(64))])\n img0.write_numeric(0x1000, 0x10203040, \"uint32_be\")\n img0.write_numeric(0x1004, 0x50607080, \"uint32_le\")\n img0.hexdump()\n\n Section #0000\n -------------\n 00001000 10 20 30 40 80 70 60 50 00 00 00 00 00 00 00 00 |. 0@.p`P........|\n 00001010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n *\n 00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n ---------------\n 64 bytes\n ---------------\n\n\nThe folling types are supported:\n\n* uint8\n* int8\n* uint16\n* int16\n* uint32\n* int32\n* uint64\n* int64\n* float32\n* float64\n\nIn any case, endianess suffixes **_be** or **_le** are required.\n\nArrays are also supported.\n\n.. code-block:: python\n\n img0 = Image([Section(0x1000, bytes(64))])\n img0.write_numeric_array(0x1000, [0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000], \"uint16_le\")\n img0.hexdump()\n\n Section #0000\n -------------\n 00001000 00 10 00 20 00 30 00 40 00 50 00 60 00 70 00 80 |... .0.@.P.`.p..|\n 00001010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n *\n 00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n ---------------\n 64 bytes\n ---------------\n\n\nThis concludes our tutorial for now, but there is more stuff to follow...\n\nDocumentation\n-------------\n\nFor full documentation, including installation, tutorials and PDF documents, please see `Readthedocs `_\n\nBugs/Requests\n-------------\n\nPlease use the `GitHub issue tracker `_ to submit bugs or request features\n\n\nReferences\n----------\n\n`Here `_ is an overview of some of the classic hex-file formats.\n\nAuthors\n-------\n\n- `Christoph Schueler `_ - Initial work and project lead.\n\n\nLicense\n-------\n\nThis project is licensed under the GNU General Public License v2.0\n\nContribution\n------------\n\nIf you contribute code to this project, you are implicitly allowing your code to be distributed under the GNU General Public License v2.0. You are also implicitly verifying that all code is your original work.\n\n\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/christoph2/objutils", "keywords": "hex files,intel hex,s19,srec,srecords,object files,map files,embedded,microcontroller,ECU,shf,rfc4194", "license": "GPLv2", "maintainer": "", "maintainer_email": "", "name": "objutils", "package_url": "https://pypi.org/project/objutils/", "platform": "", "project_url": "https://pypi.org/project/objutils/", "project_urls": { "Homepage": "http://github.com/christoph2/objutils" }, "release_url": "https://pypi.org/project/objutils/0.4.12/", "requires_dist": [ "future", "mako", "six", "construct", "attrs (>=19.3.0)", "sortedcontainers", "SQLAlchemy", "bumpversion ; extra == 'develop'", "sphinxcontrib-napoleon ; extra == 'docs'" ], "requires_python": "", "summary": "Objectfile library for Python", "version": "0.4.12", "yanked": false, "yanked_reason": null }, "last_serial": 12672343, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "fdfdcc37e046f7b70ad9f0d94daa05c0", "sha256": "1d10a32d345c47a9818e33ae98f856194556d1fb971aa36cbaf0e7fd70b99d9e" }, "downloads": -1, "filename": "objutils-0.1.1.tar.gz", "has_sig": false, "md5_digest": "fdfdcc37e046f7b70ad9f0d94daa05c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 418929, "upload_time": "2019-10-20T10:07:51", "upload_time_iso_8601": "2019-10-20T10:07:51.035834Z", "url": "https://files.pythonhosted.org/packages/b4/c9/3ce44604071dfcdf06fce5a485d3542ead65f219a933ae158ce89b70e557/objutils-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "2022585dd29090c33cd1171bbc2ef4ed", "sha256": "98a4ee85f4c1738522855ac0f36b74ced3a1ea816c59ecbe44c60afb0edfedfd" }, "downloads": -1, "filename": "objutils-0.2.1.tar.gz", "has_sig": false, "md5_digest": "2022585dd29090c33cd1171bbc2ef4ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 420390, "upload_time": "2019-10-20T16:37:17", "upload_time_iso_8601": "2019-10-20T16:37:17.742788Z", "url": "https://files.pythonhosted.org/packages/3f/72/89b9d994a01a881bed4b0dc3bda1fe0a4ba0aae3c8c208dd36e1761cdcfc/objutils-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "4cbdd16319c95b3843da7cdc86fea552", "sha256": "a2a84287008d0fb9d41bf558553bed189911a0fb67d579fca9c31538c28c0a10" }, "downloads": -1, "filename": "objutils-0.2.2.tar.gz", "has_sig": false, "md5_digest": "4cbdd16319c95b3843da7cdc86fea552", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 421625, "upload_time": "2019-10-21T14:47:39", "upload_time_iso_8601": "2019-10-21T14:47:39.756985Z", "url": "https://files.pythonhosted.org/packages/71/f2/7f77a738b998a4ff2cc1448b4b226860430c7488f61b7291e57cb9567e2c/objutils-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "4d8d58d477403609c92eb7896bc9f7c0", "sha256": "6476a2fe0d1b70627c8c5086342049d4f6216f7dfa2dff5cd096170abe2ed501" }, "downloads": -1, "filename": "objutils-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4d8d58d477403609c92eb7896bc9f7c0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 136057, "upload_time": "2020-10-11T07:22:29", "upload_time_iso_8601": "2020-10-11T07:22:29.992961Z", "url": "https://files.pythonhosted.org/packages/df/2b/3e68fb4335ad81f6fbccbfea34ae1631bec0626c30bc94181f84b59eab52/objutils-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "64f63d3fcbe347894dc94b88174540d0", "sha256": "488015b831ef8462ecb286fb819e00657dc9bffeab0913b86ec79fc9698ed61b" }, "downloads": -1, "filename": "objutils-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "64f63d3fcbe347894dc94b88174540d0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 136625, "upload_time": "2020-12-10T04:16:38", "upload_time_iso_8601": "2020-12-10T04:16:38.140670Z", "url": "https://files.pythonhosted.org/packages/8c/66/a3f6249d79add5c80ed1074e3d132a5a06c0c101ed04be7f5bae8ab9470a/objutils-0.4.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.12": [ { "comment_text": "", "digests": { "md5": "28604f6c3e10358b1fa43305f441a967", "sha256": "82729b0dc84f1db4fb47778b8474cca82255c45500dc782c1e59643471fdaeb9" }, "downloads": -1, "filename": "objutils-0.4.12-py3-none-any.whl", "has_sig": false, "md5_digest": "28604f6c3e10358b1fa43305f441a967", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 136274, "upload_time": "2022-01-24T08:35:47", "upload_time_iso_8601": "2022-01-24T08:35:47.976249Z", "url": "https://files.pythonhosted.org/packages/24/67/c29abd86499f771ef5dbec373ec87580dc3fd5732770da3d24486f28d799/objutils-0.4.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f803e91cdb20ad580470c2517e0422a8", "sha256": "c38948bfd344bbf0aac638dbeb7e3856d75465daf2017d2de206488cee30b280" }, "downloads": -1, "filename": "objutils-0.4.12.tar.gz", "has_sig": false, "md5_digest": "f803e91cdb20ad580470c2517e0422a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105387, "upload_time": "2022-01-24T08:35:50", "upload_time_iso_8601": "2022-01-24T08:35:50.339702Z", "url": "https://files.pythonhosted.org/packages/ec/47/1ad4ca9808c2859e38c2c50f8cd8ef3467b81221cbfeaa3e49df36d81917/objutils-0.4.12.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "5c43295a07090b0e91fd642c2d41fded", "sha256": "ba89d13f74af11044b79f5cdfded84af36c86eedc691e57956c85a235ca8c0d3" }, "downloads": -1, "filename": "objutils-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5c43295a07090b0e91fd642c2d41fded", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 135371, "upload_time": "2020-12-11T13:33:55", "upload_time_iso_8601": "2020-12-11T13:33:55.934126Z", "url": "https://files.pythonhosted.org/packages/51/38/77fd6a6d37a987d0c3ff3f705c2f2de35f678a4abc970facf4e53ec9c65a/objutils-0.4.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.7": [ { "comment_text": "", "digests": { "md5": "4c2ddcb24d3a5a1d743cea759539917e", "sha256": "af39ca5fdc6d6a768cfa1ef0c2ba0a397edc3b82f9ba98f5322b7af5b8a521fc" }, "downloads": -1, "filename": "objutils-0.4.7-py3-none-any.whl", "has_sig": false, "md5_digest": "4c2ddcb24d3a5a1d743cea759539917e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 134369, "upload_time": "2021-11-19T09:33:57", "upload_time_iso_8601": "2021-11-19T09:33:57.254332Z", "url": "https://files.pythonhosted.org/packages/27/1e/46e4f8b48b9cea11e959c6c470e1a98d01bcdff5d2f1e497686a487b5568/objutils-0.4.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ef5d95dc710cf4f04fff5e4860c5362a", "sha256": "14c38007de91a12fba9f1ba75d9b3dddbc10290264376fb025c20bbb8075c275" }, "downloads": -1, "filename": "objutils-0.4.7.tar.gz", "has_sig": false, "md5_digest": "ef5d95dc710cf4f04fff5e4860c5362a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103753, "upload_time": "2021-11-19T09:33:58", "upload_time_iso_8601": "2021-11-19T09:33:58.857038Z", "url": "https://files.pythonhosted.org/packages/95/4c/b682435d3beef1ba3a59c1615a2e0772260cc3bb78beb026d2fff906f438/objutils-0.4.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.8": [ { "comment_text": "", "digests": { "md5": "f02de215dba4918a35aee129b12f124a", "sha256": "54cd880e591ed48d003f3925d1e963055d0be625936e92c20b63413c994a4edd" }, "downloads": -1, "filename": "objutils-0.4.8-py3-none-any.whl", "has_sig": false, "md5_digest": "f02de215dba4918a35aee129b12f124a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 136311, "upload_time": "2022-01-18T07:30:45", "upload_time_iso_8601": "2022-01-18T07:30:45.559247Z", "url": "https://files.pythonhosted.org/packages/ea/a8/57d66bc143a568a90487fada66b84c796bb5f03406a6222a41fe02f8b665/objutils-0.4.8-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7bfba7dfecf9243908e3510185eedfb5", "sha256": "c707b2aea7fdbb810301b7d360378bc60cac48306e28fcb7a4a6bd9406f34c90" }, "downloads": -1, "filename": "objutils-0.4.8.tar.gz", "has_sig": false, "md5_digest": "7bfba7dfecf9243908e3510185eedfb5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105200, "upload_time": "2022-01-18T07:30:47", "upload_time_iso_8601": "2022-01-18T07:30:47.255221Z", "url": "https://files.pythonhosted.org/packages/b1/77/f9bb4c87f005ee82b24334892359abf926cf017d401d1a6892162c319313/objutils-0.4.8.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "28604f6c3e10358b1fa43305f441a967", "sha256": "82729b0dc84f1db4fb47778b8474cca82255c45500dc782c1e59643471fdaeb9" }, "downloads": -1, "filename": "objutils-0.4.12-py3-none-any.whl", "has_sig": false, "md5_digest": "28604f6c3e10358b1fa43305f441a967", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 136274, "upload_time": "2022-01-24T08:35:47", "upload_time_iso_8601": "2022-01-24T08:35:47.976249Z", "url": "https://files.pythonhosted.org/packages/24/67/c29abd86499f771ef5dbec373ec87580dc3fd5732770da3d24486f28d799/objutils-0.4.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f803e91cdb20ad580470c2517e0422a8", "sha256": "c38948bfd344bbf0aac638dbeb7e3856d75465daf2017d2de206488cee30b280" }, "downloads": -1, "filename": "objutils-0.4.12.tar.gz", "has_sig": false, "md5_digest": "f803e91cdb20ad580470c2517e0422a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105387, "upload_time": "2022-01-24T08:35:50", "upload_time_iso_8601": "2022-01-24T08:35:50.339702Z", "url": "https://files.pythonhosted.org/packages/ec/47/1ad4ca9808c2859e38c2c50f8cd8ef3467b81221cbfeaa3e49df36d81917/objutils-0.4.12.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }