{ "info": { "author": "Gilad Naaman", "author_email": "gilad@naaman.io", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# Hydras\n\n[![Build Status](https://travis-ci.org/Gilnaa/Hydras.svg?branch=master)](https://travis-ci.org/Gilnaa/Hydras)\n\n'*Hydras*' is a python library that allows the developer to create structured binary data according to simple rules,\nsomewhat similar to how C does it with a struct.\n\nWhy \"Hydras\"? `Hydra` was taken.\n\nHydras versions up to (and including) `v2.*` supported both Python2 and Python3.\nNewer version dropped Python2 support entirely.\n\n## Roadmap\n\nThis a list of features we want to implement before releasing Hydras 3.0\n\n* Add a bitfield-implementation\n* Enum as bit-flags\n\nContributions are welcome.\n\n## Example\n\nThe 'examples' directory is old, not informative, and in pretty bad shape, but the CI does make sure\nthat the code there is working.\n\nInstead, here's \n\n```python\nfrom hydras import *\n\n\nclass Opcodes(Enum, underlying_type=u8):\n KEEP_ALIVE = 3\n DATA = 15\n\nclass Header(Struct):\n opcode = Opcodes\n data_length = u32\n\nclass DataPacket(Struct):\n # A nested structure. \"data_length = 128\" sets the default DataLength value for `Header`s inside `DataPacket`s\n header = Header(dict(opcode=Opcodes.DATA, \n data_length=128))\n\n # Creates an array of bytes with a length of 128 bytes.\n payload = u8[128]\n\n # You can override the constructor, but you must keep an \"overload\" that receives no arguments.\n # Even without this being defined, the class could have been used the same: `DataPacket(payload=...)`\n # This constructor also sets the `data_length` property\n def __init__(self, initial_values: dict = None):\n # Must call the base ctor in order to initialize the data members\n super(DataPacket, self).__init__(initial_values)\n\n if 'payload' in initial_values:\n self.header.data_length = len(payload)\n\nif __name__ == '__main__':\n packet = DataPacket()\n\n # You can transform the object into a byte string using the `serialize` method.\n zeroes = packet.serialize() # => b'\\x0f\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\n # Alternatively,\n zeroes = bytes(packet)\n\n # You can also modify the object naturally.\n packet.payload = bytes(range(128))\n saw_tooth = packet.serialize() # => b'\\x0f\\x80\\x00\\x00\\x00\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f'\n\n # . . .\n\n # You can parse raw byte strings into an object using the deserialize class method.\n received_data = some_socket.recv(len(packet))\n parsed_packet = DataPacket.deserialize(received_data)\n```\n\nYou can find more examples in the examples directory.\n\n## How does it work?\n\nIn the core of the library, there are two types of objects: `Serializer` and `Struct`.\n\n`Serializer` is an object that can convert between common python objects (e.g. `int` and `float`) and to and from `bytes`.\n`Serializer`s are mostly supplied by the library, but can also be written by the user.\n\nA simple example of a `Serializer` is `u8`; a more complex example is `EnumClass` which requires more user involvement.\n\n`Struct` is an aggregate of named members, where each has a concrete type associated with it (which is either a `Serializer` or another `Struct`).\n\n`Struct`s are always defined by the user.\n\nThe developer can thus declare a struct using the following notation:\n\n```python\nclass (Struct):\n = ()\n```\n\nFor example:\n\n```python\nclass Message(Struct):\n TimeOfDay = u64 # This creates a u64 formatter. Parentheses are optional.\n DataLength = u8(128) # A default value is optional\n\nMessage().serialize() #=> b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x80'\n```\n\n## Types\n\n### Primitive Types\n\n\"Primitive\" types are integers and floating-point numbers, and are named similarly to Rust's primitive types.\n\nIntegers come in signed and unsigned variants with bitsizes of 8, 16, 32, 64: `u8, i8, u16, etc...`\n\nFloating point are named `f32` and `f64`.\n\nWhen serializing, the endianness of a primitive is set to that of the \"target\" arch (as configured by the user); \nthe user can instead specify field-specific endianness by using the `_be` or `_le` variants (e.g. `u32_be`).\n\n### Enums\n\nEnums are closed sets of named values. By default they are serialized as if their underlying type is `u32` \n\n```python\nfrom hydras import *\n\n\nclass MyEnum(Enum):\n a = 1\n b = auto()\n c = 10\n d = auto()\n\nclass SmallerEnum(Enum, underlying_type=u8):\n a = 1\n b = auto()\n c = 10\n d = auto()\n\nclass MyStruct(Struct):\n e = MyEnum\n se = SmallerEnum(SmallerEnum.c)\n\nif __name__ == '__main__':\n print(MyStruct().serialize()) # => b'\\x01\\x00\\x00\\x00\\x0C'\n```\n\n### Arrays\n\nAn array can be created by appending a `[size]` or `[min_size:max_size]` to another type.\nThe type of a `serializer[size]` expression is itself a serializer type.\n\nThe python-value of an array can be either `list` or a `tuple`; if the value is shorter than\nthat of the array, it will be padded with zeroes on serialization.\n\nWhen the type of the array is u8, the python value can also be `bytes` and `bytearray`. \n\nFor example:\n\n```python\nfrom hydras import *\nclass Foo(Struct):\n # Fixed length-arrays\n byte_array = u8[32]\n array_with_uniform_default_value = u16(57)[4]\n array_with_nonuniform_default_value = u16[4]([1, 2, 3, 4])\n\n\nif __name__ == '__main__':\n f = Foo()\n f.byte_array = b'123' # This will be padded with zeroes\n```\n\nIf the default value of the array is a `bytes` or `bytearray` object, Hydras will deserialize to that type.\n\n```python\nfrom hydras import *\nclass Bar(Struct):\n byte_array = u8[4](default_value=bytearray())\n\n\nif __name__ == '__main__':\n print(Bar.deserialize(b'\\x00\\x11\\x22\\x33').byte_array)\n # => bytearray(b'\\x00\\x01\\x02\\x03')\n```\n\nVariable-length arrays can be created by giving a slice as the size of the array.\n\n```python\n# Variable-length array with at least 5 members\nu8[5:]\n# Variable-length array with up to 5 members (inclusive)\nu8[:5]\n# Variable-length array with between 6 and 8 members\nu8[6:8]\n# Unbound array\nu8[:]\n```\n\nVariable-length arrays, being VSTs (read more below), must be placed last in a struct.\nWhen deserializing, the tail of the buffer will be given to the array to parse. \nThe tail must match the VLA's size specification or an error will be raised.\n\n### Variable-length types\n\nVariable-length types (VST) can only be placed as the last member of a struct. \n\nThe most basic variable-length type is a VLA (Variable-length array; seen above).\nA struct whose last member is a VST is also a VST.\n\n### Mixins ###\nWith `Mixin`s, you can copy one struct's fields into another, losing the first structs identity.\nYou can also prefix the the implanted fields' names with a constant string.\n```python\nclass Aggregate(Struct):\n version = u8\n\nclass Struct1(Struct):\n magic = u32\n _ag = Mixin(Aggregate)\n\nclass Struct2(Struct):\n magic = u32\n version = u16\n _ag = Mixin(Aggregate, prefix='agg_')\n\nassert list(Struct1._hydras_members()) == ['magic', 'version']\nassert list(Struct2._hydras_members()) == ['magic', 'version', 'agg_version']\n``` \n\n## Endianness\n\nIntegral fields not suffixed with `_be` or `_le` will take the endianness of the \"target\".\nThe target endian by default is the same as that of the host machine, but can be configured by modifying `HydraSettings`\nor by specifying serialization-time settings.\n\n## Validators\n\nA validator object can be assigned to a struct data member to define validation rules.\nWhen deserializing an object from binary data, the framework will validate the values\nusing the user-defined validation-rules.\n\nIf an invalid value is encountered, a ValueError is raised.\n\n```python\nclass MeIsValidated(Struct):\n member = i8(0, validator=RangeValidator(-15, 15))\n\n...\n\nMeIsValidated.deserialize('\\x10') # => ValueError: The deserialized data is invalid.\n```\n\nThere are a few built-in validators defined for the following rules:\n\n- RangeValidator: Range check\n- ExactValueValidator: Exact value check\n- BitSizeValidator: Bit-Length check\n- CustomValidator: Lambda validation (receives a user function.)\n- TrueValidator & FalseValidator: Dummy validators (always true / always false)\n\nMore validators can be defined by subclassing the Validator class.\n\n### Lambda Validators\n\nThe user can use a lambda expression (or any function) instead of a validator object as validation rule.\n\n```python\nclass MeIsLambda(Struct):\n member = i8(0, validator=lambda value: value % 3 == 0)\n```\n\n## Hooks\n\nA `Struct` derived class can implement hooks.\n\n### before_serialize\n\nThis method will be called before a serialization is about to occur.\n\n**Note**: This method will not be called if either `HydraSettings.dry_run` is True,\nor `serialize` is called with `dry_run=True`\n\n### after_serialize\n\nThis method will be called after a serialization has occurd.\n\n**Note**: This method will not be called if either `HydraSettings.dry_run` is True,\nor `serialize` is called with `dry_run=True`\n\n### validate\n\nCalled after a de-serialization is completed.\nIf it returns a `False`y value, the `deserialize` raises an error.\n\nIf not overriden by the user in a custom Struct class, the method\nwill validate using the type formatters' validators.\n\nThe user can, of course, override the method to add custom validations,\nand then invoke the original validate method.\n\n**Note**: No errors will be raised if `HydraSettings.validate` is set to `False`.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Gilnaa/Hydras", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "Hydras", "package_url": "https://pypi.org/project/Hydras/", "platform": "", "project_url": "https://pypi.org/project/Hydras/", "project_urls": { "Homepage": "https://github.com/Gilnaa/Hydras" }, "release_url": "https://pypi.org/project/Hydras/3.1.2/", "requires_dist": [ "pyelftools" ], "requires_python": "", "summary": "A module for constructions of structured binary packets.", "version": "3.1.2", "yanked": false, "yanked_reason": null }, "last_serial": 8001178, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "2967055598659e77b335fda01c0acb9b", "sha256": "a1ff819a1fe04aa4f45ece5c042181306eb687bc36920669f10d5785c654159b" }, "downloads": -1, "filename": "Hydras-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2967055598659e77b335fda01c0acb9b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22307, "upload_time": "2019-05-10T15:06:36", "upload_time_iso_8601": "2019-05-10T15:06:36.898784Z", "url": "https://files.pythonhosted.org/packages/0f/eb/e8e8bc59cec310469da2b2c0b489a06acd430019087c5279e262b2b04ba6/Hydras-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "26842aa8cebd26ff5e6fe87232e17dd9", "sha256": "dea08c9cda7764307f101ff2c4d9f22d0b74b53a97d55ac66b5ca4c188284e6d" }, "downloads": -1, "filename": "Hydras-1.0.0.tar.gz", "has_sig": false, "md5_digest": "26842aa8cebd26ff5e6fe87232e17dd9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16151, "upload_time": "2019-05-10T15:06:38", "upload_time_iso_8601": "2019-05-10T15:06:38.877213Z", "url": "https://files.pythonhosted.org/packages/0b/28/314289cfa37b020c0623bd2e30da699dc6158fa43450502f1b5fbc555d5b/Hydras-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "4b1a4e4653866983ba8321f4971ae74d", "sha256": "88cd93b7ba0694cb1da4b4e4756fd9c457d5bd73e6edfeb1b3a0bc4d03d3fa86" }, "downloads": -1, "filename": "Hydras-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4b1a4e4653866983ba8321f4971ae74d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22135, "upload_time": "2019-10-14T16:07:22", "upload_time_iso_8601": "2019-10-14T16:07:22.376804Z", "url": "https://files.pythonhosted.org/packages/b8/ac/4c523bbc02efbfdb9da4747f73742fe8d2dfc764a38ffb40126d0add17d2/Hydras-2.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c59111aa899eb459f7ef683dfe6d2d0c", "sha256": "6ec89fab6d99db15319abb6dee6229d76f05e46b5cf1c7775485bef939be8f6a" }, "downloads": -1, "filename": "Hydras-2.0.0.tar.gz", "has_sig": false, "md5_digest": "c59111aa899eb459f7ef683dfe6d2d0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16277, "upload_time": "2019-10-14T16:07:24", "upload_time_iso_8601": "2019-10-14T16:07:24.415438Z", "url": "https://files.pythonhosted.org/packages/c5/dc/fde418a8938cd5156d75c2c1950e734ddb784b0aa8105156c9653c3cbf33/Hydras-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "a323b0dfdb3aeccd4a2c743d24fafa40", "sha256": "e11ec959f1c629603aa16b280c2b689258eecc97628831c251feb532638fec78" }, "downloads": -1, "filename": "Hydras-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a323b0dfdb3aeccd4a2c743d24fafa40", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22139, "upload_time": "2019-10-16T05:49:39", "upload_time_iso_8601": "2019-10-16T05:49:39.044123Z", "url": "https://files.pythonhosted.org/packages/93/cc/ccb8b7f1fdf53025ec9aed3cc701a282aed4efed539e47868835d855e952/Hydras-2.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ec7136e0de1802bef8557ea83a68852c", "sha256": "2d99c13452909b1ad805285e404914918709b2a6d00e62e8f96eeaa101ab1a8e" }, "downloads": -1, "filename": "Hydras-2.0.1.tar.gz", "has_sig": false, "md5_digest": "ec7136e0de1802bef8557ea83a68852c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16286, "upload_time": "2019-10-16T05:49:40", "upload_time_iso_8601": "2019-10-16T05:49:40.863874Z", "url": "https://files.pythonhosted.org/packages/37/f2/28d042b550cd255b8a05242cabc64e47680cedb8791947f81684082e8019/Hydras-2.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "eb03586f2d70740d8717afa9742e8072", "sha256": "a25d06232b5782b2753aea571949dc0b784c50ce4869c164d1bb9025f5ccd126" }, "downloads": -1, "filename": "Hydras-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "eb03586f2d70740d8717afa9742e8072", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22154, "upload_time": "2019-10-21T08:11:26", "upload_time_iso_8601": "2019-10-21T08:11:26.108491Z", "url": "https://files.pythonhosted.org/packages/0c/4b/42a58a2d35a835950feaecf8b831fd04177fc147a66cffc408f9bf95a1aa/Hydras-2.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "30dfb935e515c36e7d09b0e1d3292870", "sha256": "e9691dc38e76fe76a0d44c538ebd7c1af2d8e0b83bb8182fdf559502d2cd2fc7" }, "downloads": -1, "filename": "Hydras-2.0.2.tar.gz", "has_sig": false, "md5_digest": "30dfb935e515c36e7d09b0e1d3292870", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16267, "upload_time": "2019-10-21T08:11:28", "upload_time_iso_8601": "2019-10-21T08:11:28.087137Z", "url": "https://files.pythonhosted.org/packages/75/e4/b6552331fa3b9636a0fa44aa8e8f648969255abd6a148548da934f72a616/Hydras-2.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "48812047f59e7b56ffba22d16c474a1c", "sha256": "d2ff968a266c04c458831bfa0d4c5d7db10d56db8c586e2bdd06781786471e7b" }, "downloads": -1, "filename": "Hydras-3.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "48812047f59e7b56ffba22d16c474a1c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31931, "upload_time": "2019-11-18T14:02:08", "upload_time_iso_8601": "2019-11-18T14:02:08.501297Z", "url": "https://files.pythonhosted.org/packages/2a/f2/05d0d73b5e39a175ef5792d862134f6bae17bdee0d086a44ab746b005522/Hydras-3.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b7e96ae7ac5329168e49eaa17f10eb17", "sha256": "21d33ffd467220ca069a5f31625ee6f68c48a8a645f8e169e32a750c6d3e59fb" }, "downloads": -1, "filename": "Hydras-3.0.0.tar.gz", "has_sig": false, "md5_digest": "b7e96ae7ac5329168e49eaa17f10eb17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25120, "upload_time": "2019-11-18T14:02:10", "upload_time_iso_8601": "2019-11-18T14:02:10.554117Z", "url": "https://files.pythonhosted.org/packages/e0/b0/8f0f44572059bc3b8b020aa8de44e379317b6140e5036224cc7829fa667d/Hydras-3.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "7f126927c174153106977528bedd2bc8", "sha256": "ddf05902bd01f3ab4a4d72368f59dba137864eebe2e6db0bb9f13769bc4d98b4" }, "downloads": -1, "filename": "Hydras-3.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7f126927c174153106977528bedd2bc8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32442, "upload_time": "2019-11-18T20:26:30", "upload_time_iso_8601": "2019-11-18T20:26:30.830935Z", "url": "https://files.pythonhosted.org/packages/54/95/bf6caa7aa3d37f9db658c195f7f9d9d7c7162de34ed576df1308a0e82847/Hydras-3.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "cebc578df53e1572347e042c7765bbc3", "sha256": "c59572575da2433411edd59e59861e70d507fa91af3ace38cc108b71680f5895" }, "downloads": -1, "filename": "Hydras-3.0.1.tar.gz", "has_sig": false, "md5_digest": "cebc578df53e1572347e042c7765bbc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24877, "upload_time": "2019-11-18T20:26:32", "upload_time_iso_8601": "2019-11-18T20:26:32.581538Z", "url": "https://files.pythonhosted.org/packages/c4/19/0797fa0b99cc1311985f90eda82834b17fd51df4c1cba2cea7169040c291/Hydras-3.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "a475f8763b7ba80c03d4f2940028a523", "sha256": "276371588822411ab54f4b471bea5efd09d0a187158771ef4c4b6ea2d5f86294" }, "downloads": -1, "filename": "Hydras-3.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a475f8763b7ba80c03d4f2940028a523", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32758, "upload_time": "2019-11-19T09:40:07", "upload_time_iso_8601": "2019-11-19T09:40:07.723186Z", "url": "https://files.pythonhosted.org/packages/6a/6f/b97a5dd4358d68c3812876780680532fedcc8278a3ef8e0985a470318cb1/Hydras-3.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d923c486653f5d0c96bb150302e667eb", "sha256": "923ea926766d22a174b249bff29469f28db48aaee6f338ab2eae15d6f6d25f66" }, "downloads": -1, "filename": "Hydras-3.0.2.tar.gz", "has_sig": false, "md5_digest": "d923c486653f5d0c96bb150302e667eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26044, "upload_time": "2019-11-19T09:40:09", "upload_time_iso_8601": "2019-11-19T09:40:09.706554Z", "url": "https://files.pythonhosted.org/packages/53/25/6075bf6016d137f7e89cbdecbbcdbddec009ec3cdbd6ad2ce2c83dfd3d28/Hydras-3.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.3": [ { "comment_text": "", "digests": { "md5": "7c6cdd6b11e0c707ac92b6976935daf9", "sha256": "4bbf5fde44d3355d50239aeadfc6109f53f611671093fbffc517a29ecf7f0156" }, "downloads": -1, "filename": "Hydras-3.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7c6cdd6b11e0c707ac92b6976935daf9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32744, "upload_time": "2019-11-19T09:43:11", "upload_time_iso_8601": "2019-11-19T09:43:11.760414Z", "url": "https://files.pythonhosted.org/packages/ab/40/9f9d62ed94a813378163e2e2a2bb17dddbab54b3acab0645f0c16b97356b/Hydras-3.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d8c558ad7a13d30643bf6aa179fdc102", "sha256": "b7ff80d0e259d2db5131c3f6b1217d4c9771306deb0f8b502c60d2269c659113" }, "downloads": -1, "filename": "Hydras-3.0.3.tar.gz", "has_sig": false, "md5_digest": "d8c558ad7a13d30643bf6aa179fdc102", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26020, "upload_time": "2019-11-19T09:43:13", "upload_time_iso_8601": "2019-11-19T09:43:13.724631Z", "url": "https://files.pythonhosted.org/packages/47/6e/f340e5e8ab04750c0cd14442df193b32b947ac21f2ce7f7be2723d0b4c40/Hydras-3.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.4": [ { "comment_text": "", "digests": { "md5": "0febab99976620e9bd50ee5ce49ee55c", "sha256": "3c8c771d4b5dbedcd18c65d3a3db1b80d90cb9fc489d16d7cf6466816b820f26" }, "downloads": -1, "filename": "Hydras-3.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0febab99976620e9bd50ee5ce49ee55c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32811, "upload_time": "2019-11-19T11:33:43", "upload_time_iso_8601": "2019-11-19T11:33:43.615649Z", "url": "https://files.pythonhosted.org/packages/11/51/516a8718acacd635f5981b7cb3d140eb4449e8260b7ff30a03fc707f51ba/Hydras-3.0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "eb37c02462d1888b2a0e8b2ebf6cfac5", "sha256": "32e6e3d817f83c91431503a70251daeae2094b46514cf67871cb49c9695195a1" }, "downloads": -1, "filename": "Hydras-3.0.4.tar.gz", "has_sig": false, "md5_digest": "eb37c02462d1888b2a0e8b2ebf6cfac5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26087, "upload_time": "2019-11-19T11:33:45", "upload_time_iso_8601": "2019-11-19T11:33:45.740327Z", "url": "https://files.pythonhosted.org/packages/98/7b/14c043f1b70730fcfa90acc0b579bbe27772828cfd35a9af5d1ce546c3f7/Hydras-3.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.5": [ { "comment_text": "", "digests": { "md5": "2bea583762f639bbf3f2be303475c1cc", "sha256": "3fb69ef6188d1f1bc119525d8e4ac3173173e93a3bf6ccbc72e48c24ecafb6f3" }, "downloads": -1, "filename": "Hydras-3.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "2bea583762f639bbf3f2be303475c1cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33471, "upload_time": "2019-11-21T17:22:05", "upload_time_iso_8601": "2019-11-21T17:22:05.175144Z", "url": "https://files.pythonhosted.org/packages/b8/41/ce811e3d4f282373f55d102ffb40707f940c41faaa1cacee7df5252accb4/Hydras-3.0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4a7a40997610d72efed90403835580d7", "sha256": "27f6526377bd3cf433c22fa4d6457bad89e2efed47674f6056062c44a65e23e7" }, "downloads": -1, "filename": "Hydras-3.0.5.tar.gz", "has_sig": false, "md5_digest": "4a7a40997610d72efed90403835580d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26683, "upload_time": "2019-11-21T17:22:06", "upload_time_iso_8601": "2019-11-21T17:22:06.753039Z", "url": "https://files.pythonhosted.org/packages/05/4f/9e2b3f3744fc3e97abfaff7b21779b1b0675e95f37458b0bee10e0997193/Hydras-3.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.6": [ { "comment_text": "", "digests": { "md5": "94736e93b0716796d88ac7843cc60aa9", "sha256": "089074f4bcffc5851b0b96f4b73f7a83e70a9b3610a75ec09cbc6f352c5e58c3" }, "downloads": -1, "filename": "Hydras-3.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "94736e93b0716796d88ac7843cc60aa9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33610, "upload_time": "2019-11-24T17:35:33", "upload_time_iso_8601": "2019-11-24T17:35:33.495696Z", "url": "https://files.pythonhosted.org/packages/9e/2b/15247198d9e0e78400935910d4b0eb9ada38e8bd5910f7d8310167e935d5/Hydras-3.0.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c052369b5f471783c805ca063da11ada", "sha256": "a1ef5cf6dd5ade7689df3940ceddd95937d88cfaea0805179edf0c8766d3f4a4" }, "downloads": -1, "filename": "Hydras-3.0.6.tar.gz", "has_sig": false, "md5_digest": "c052369b5f471783c805ca063da11ada", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26768, "upload_time": "2019-11-24T17:35:35", "upload_time_iso_8601": "2019-11-24T17:35:35.490799Z", "url": "https://files.pythonhosted.org/packages/ee/77/fdbc89da3860ef5580a0aa31b40f56232bb69f118f8eb59e4519c54314ec/Hydras-3.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.7": [ { "comment_text": "", "digests": { "md5": "dcc8e5604a1aeca14d4df3456ef46242", "sha256": "3458846a32f53fb8b23f5adeee9cd54efb81f15ad9a2814d2c41a619c96da499" }, "downloads": -1, "filename": "Hydras-3.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "dcc8e5604a1aeca14d4df3456ef46242", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33589, "upload_time": "2019-12-01T16:00:06", "upload_time_iso_8601": "2019-12-01T16:00:06.744695Z", "url": "https://files.pythonhosted.org/packages/a7/53/a7cb93c189c53ffde17d705f018cfd8d424a0011a92c9fc22c96d170c2bc/Hydras-3.0.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "179aaa550f9d86a1069d62516e53ecea", "sha256": "9c3aaefa8f9058502968958c7ca3b2acdc36f3f9de97d830b1f225f4def71da6" }, "downloads": -1, "filename": "Hydras-3.0.7.tar.gz", "has_sig": false, "md5_digest": "179aaa550f9d86a1069d62516e53ecea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26749, "upload_time": "2019-12-01T16:00:08", "upload_time_iso_8601": "2019-12-01T16:00:08.302089Z", "url": "https://files.pythonhosted.org/packages/e5/38/6724e751a9ba0a03e5ae44198937e0df8f78e80637a7ef5a6cfba2cefffa/Hydras-3.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.8": [ { "comment_text": "", "digests": { "md5": "9387a0d254a0ca3afa4086e1c74109ca", "sha256": "dbc56a775c091d7f89a7e520f8f8ceb4667152d1407696e68ba7992ec88c1021" }, "downloads": -1, "filename": "Hydras-3.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "9387a0d254a0ca3afa4086e1c74109ca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33608, "upload_time": "2019-12-08T08:10:21", "upload_time_iso_8601": "2019-12-08T08:10:21.966459Z", "url": "https://files.pythonhosted.org/packages/5a/b9/70d3cfb42c45205e5261398af7629412e615ef6560050a746eea71fbf9af/Hydras-3.0.8-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e35c346d452123bb34ec659118406d54", "sha256": "629ff4711a1de3299d09a013f5116d4113b89ce4e3b4a3a40e320391c3186359" }, "downloads": -1, "filename": "Hydras-3.0.8.tar.gz", "has_sig": false, "md5_digest": "e35c346d452123bb34ec659118406d54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26760, "upload_time": "2019-12-08T08:10:23", "upload_time_iso_8601": "2019-12-08T08:10:23.919781Z", "url": "https://files.pythonhosted.org/packages/6d/4d/70860951327055728b2620b5965743286762dc9677e983dc651128c9ef6f/Hydras-3.0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.9": [ { "comment_text": "", "digests": { "md5": "832858ae6daf8bcbd2f11f566151150a", "sha256": "c0462d1a1c9eede4f6fc55bc5e136794d64246779ed1d0d328d596683b57655d" }, "downloads": -1, "filename": "Hydras-3.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "832858ae6daf8bcbd2f11f566151150a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33681, "upload_time": "2020-01-07T11:41:38", "upload_time_iso_8601": "2020-01-07T11:41:38.996250Z", "url": "https://files.pythonhosted.org/packages/28/fb/e00af2d17430f3154778c6865748b4a459bf98e79cee1ec2c6a27ee77aaf/Hydras-3.0.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "330c828e39cf2d914d92ea64e01ad25d", "sha256": "a70f864b10913c3d152e3123929437fac52b5521045888fefdd3c4a1e9c577cf" }, "downloads": -1, "filename": "Hydras-3.0.9.tar.gz", "has_sig": false, "md5_digest": "330c828e39cf2d914d92ea64e01ad25d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26837, "upload_time": "2020-01-07T11:41:40", "upload_time_iso_8601": "2020-01-07T11:41:40.724145Z", "url": "https://files.pythonhosted.org/packages/1f/6f/f7f60abec04a11b5381b24fdc0bb6aa01479e77f7a8b679dacaac9ace937/Hydras-3.0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "3.1.0": [ { "comment_text": "", "digests": { "md5": "a07929c2dfebbed3be9348163b4acfec", "sha256": "83efc8e1541e7ac95962b433cb3f10e2b00e57c2d086755aec812f45682532de" }, "downloads": -1, "filename": "Hydras-3.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a07929c2dfebbed3be9348163b4acfec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34284, "upload_time": "2020-05-10T17:23:33", "upload_time_iso_8601": "2020-05-10T17:23:33.235403Z", "url": "https://files.pythonhosted.org/packages/23/34/12bfe20d1c415878c3b4b02ce34ac74152680a0755f4dcf728fa78ff2934/Hydras-3.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ace134080bf3473f87938221fa783cea", "sha256": "2ce14ddd45a6c8d57bf554e4c68803ff25b1bc579e0b6c964d5e8f16b19f5cd7" }, "downloads": -1, "filename": "Hydras-3.1.0.tar.gz", "has_sig": false, "md5_digest": "ace134080bf3473f87938221fa783cea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27406, "upload_time": "2020-05-10T17:23:35", "upload_time_iso_8601": "2020-05-10T17:23:35.139028Z", "url": "https://files.pythonhosted.org/packages/32/da/1f5b4211fe810a81654174a3e1b60e04ffb9d5e05c89eef16b0b580346af/Hydras-3.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "3.1.1": [ { "comment_text": "", "digests": { "md5": "78dfde6ae8f6eaf021a36e152fe9c522", "sha256": "97eb0ea98db437dc88a9838097535f9be2e57cc8d5feba93fe1ace38f9c6d844" }, "downloads": -1, "filename": "Hydras-3.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "78dfde6ae8f6eaf021a36e152fe9c522", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34460, "upload_time": "2020-08-18T17:39:44", "upload_time_iso_8601": "2020-08-18T17:39:44.203482Z", "url": "https://files.pythonhosted.org/packages/4e/54/79bdc176a05dc95b4025135eeed4d23e4b65fa131d2724abd43f125fc95e/Hydras-3.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7e3d1ae3e95f37ed033e13abb446975f", "sha256": "63cf5f4d369362883bfb65fa5724bcbd46aee9602025bdcab8956a8a26a0d57e" }, "downloads": -1, "filename": "Hydras-3.1.1.tar.gz", "has_sig": false, "md5_digest": "7e3d1ae3e95f37ed033e13abb446975f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27583, "upload_time": "2020-08-18T17:39:45", "upload_time_iso_8601": "2020-08-18T17:39:45.922032Z", "url": "https://files.pythonhosted.org/packages/dd/dd/b342389603479d84d494a5f8809a3b13c568da74d4dbafe56cff0d46eff0/Hydras-3.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "3.1.2": [ { "comment_text": "", "digests": { "md5": "378854f536c54ee773a99e4c3fb8a85a", "sha256": "f7e38874b6059ad7fff56ea063f9a87215be5f964f3ba9ac33f7f83aa2900f96" }, "downloads": -1, "filename": "Hydras-3.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "378854f536c54ee773a99e4c3fb8a85a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34504, "upload_time": "2020-08-20T02:52:10", "upload_time_iso_8601": "2020-08-20T02:52:10.360792Z", "url": "https://files.pythonhosted.org/packages/1c/d2/ada86ef0416b4b784ce08183ba3d8841d943d354487e2cee3b54bf989e4a/Hydras-3.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "86aaabc9a9071dada6df24de878eb429", "sha256": "6c9d3383a1c99527c93a3fe2bb213c8fd0f95733398faacb7f083b81ad4f66f6" }, "downloads": -1, "filename": "Hydras-3.1.2.tar.gz", "has_sig": false, "md5_digest": "86aaabc9a9071dada6df24de878eb429", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27603, "upload_time": "2020-08-20T02:52:12", "upload_time_iso_8601": "2020-08-20T02:52:12.410682Z", "url": "https://files.pythonhosted.org/packages/31/a9/5f3fae0540954d393970e4eff92390eceaffe32317b19f0dc6e0c79d6712/Hydras-3.1.2.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "378854f536c54ee773a99e4c3fb8a85a", "sha256": "f7e38874b6059ad7fff56ea063f9a87215be5f964f3ba9ac33f7f83aa2900f96" }, "downloads": -1, "filename": "Hydras-3.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "378854f536c54ee773a99e4c3fb8a85a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34504, "upload_time": "2020-08-20T02:52:10", "upload_time_iso_8601": "2020-08-20T02:52:10.360792Z", "url": "https://files.pythonhosted.org/packages/1c/d2/ada86ef0416b4b784ce08183ba3d8841d943d354487e2cee3b54bf989e4a/Hydras-3.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "86aaabc9a9071dada6df24de878eb429", "sha256": "6c9d3383a1c99527c93a3fe2bb213c8fd0f95733398faacb7f083b81ad4f66f6" }, "downloads": -1, "filename": "Hydras-3.1.2.tar.gz", "has_sig": false, "md5_digest": "86aaabc9a9071dada6df24de878eb429", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27603, "upload_time": "2020-08-20T02:52:12", "upload_time_iso_8601": "2020-08-20T02:52:12.410682Z", "url": "https://files.pythonhosted.org/packages/31/a9/5f3fae0540954d393970e4eff92390eceaffe32317b19f0dc6e0c79d6712/Hydras-3.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }