{ "info": { "author": "John Cass", "author_email": "john.cass77@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# WTFIX\n\nThe Pythonic Financial Information eXchange (FIX) client for humans.\n\n[![Build status](https://travis-ci.org/jcass77/WTFIX.svg?branch=develop)](https://travis-ci.org/jcass77/WTFIX)\n[![Coverage Status](https://coveralls.io/repos/github/jcass77/WTFIX/badge.svg?branch=develop)](https://coveralls.io/github/jcass77/WTFIX?branch=develop)\n[![PyPI version shields.io](https://img.shields.io/pypi/v/wtfix.svg)](https://pypi.python.org/pypi/wtfix/)\n[![PyPI pyversions](https://img.shields.io/pypi/pyversions/wtfix.svg)](https://pypi.python.org/pypi/wtfix/)\n[![PyPI license](https://img.shields.io/pypi/l/wtfix.svg)](https://pypi.python.org/pypi/wtfix/)\n[![Code style:black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://pypi.org/project/black/)\n\n\n## Project Highlights and Goals\n\n- Built from the ground up for Python 3.\n- Batteries included - comes with everything that you need to connect to a FIX server and start sending and receiving\nmessages in minutes. Provides default implementations for:\n - Authentication\n - Maintaining a heartbeat\n - Sequence number management and resend requests\n - Message storage and retrieval\n- Fast, easy to understand message processing pipeline based on a modern ``async and await`` implementation.\n- Easily extendable architecture - modular 'apps' can be added to the pipeline stack to add custom message processing\nroutines or new application features.\n\n ```python\n PIPELINE_APPS = [\n \"my_app.apps.SecretAlgoTradingRecipe\", # <-- Your application logic\n \"wtfix.apps.api.RESTfulServiceApp\", # REST API for sending messages\n \"wtfix.apps.brokers.RedisPubSubApp\", # Redis Pub/Sub broker for sending / receiving messages\n \"wtfix.apps.admin.HeartbeatApp\", # Heartbeat monitoring and maintenance\n \"wtfix.apps.admin.AuthenticationApp\", # Login / logout handling\n \"wtfix.apps.admin.SeqNumManagerApp\", # Message gap detection and filling\n \"wtfix.apps.store.MessageStoreApp\", # Store messages (caching or persistence)\n \"wtfix.apps.utils.InboundLoggingApp\", # Log inbound messages\n \"wtfix.apps.parsers.RawMessageParserApp\", # Message parsing: Logon (A): {BeginString (8): FIX.4.4 | BodyLength (9): 99 | MsgType (35): A | MsgSeqNum (34): 1 | SenderCompID (49): SENDER | SendingTime (52): 20190305-08:45:45.979 | TargetCompID (56): TARGET | EncryptMethod (98): 0 | HeartBtInt (108): 30 | Username (553): USERNAME | Password (554): PASSWORD | ResetSeqNumFlag (141): Y | CheckSum (10): 94}\n \"wtfix.apps.utils.OutboundLoggingApp\", # Log outbound messages\n \"wtfix.apps.wire.WireCommsApp\", # Raw message encoding / decoding: b'8=FIX.4.4\\x019=99\\x0135=A\\x0134=1\\x0149=SENDER\\x0152=20190305-08:42:32.793\\x0156=TARGET\\x0198=0\\x01108=30\\x01553=USERNAME\\x01554=PASSWORD\\x01141=Y\\x0110=081\\x01'\n \"wtfix.apps.sessions.ClientSessionApp\", # HTTP session management\n ]\n ```\n- Messages can be cached in memory or saved to a Redis message store for later retrieval. Alternatively you can add\nyour own message storage solution using the provided interfaces.\n- Send messages directly from the pipeline, via 3rd party applications using a REST API, or by publishing them to\na Redis Pub/Sub channel for immediate delivery.\n\n- Provides a convenient ``@on`` decorator for fine-grained control over which apps will respond to which types of messages:\n\n ```python\n from wtfix.apps.base import MessageTypeHandlerApp, on\n from wtfix.protocol.common import MsgType\n from wtfix.conf import settings\n\n logger = settings.logger\n\n class SecretAlgoTradingRecipe(MessageTypeHandlerApp):\n\n @on(MsgType.Logon) # Only invoked when 'Logon (type A)' messages are received.\n def on_logon(self, message):\n self.send_security_definition_request()\n return message\n\n def on_receive(self, message): # Invoked for every type of message.\n logger.info(f\"Received message {message}!\")\n ```\n\n- Provides custom `Field` and `FieldMap` types for working with FIX tags and field values. These types are 'pythonic',\nimplementing many of the standard protocols, and behave as expected when you integrate them in existing Python\ncode.\n- A simple message tag syntax, with various convenience methods, for quick access to commonly\nused message attributes.\n\n ```python\n >>> from wtfix.message import admin\n >>> from wtfix.protocol.common import Tag\n\n # Instantiate a new 'Logon' message\n >>> logon_msg = admin.LogonMessage(\"my_username\", \"my_password\", heartbeat_int=30)\n\n # Short, concise string representation\n >>> str(logon_msg)\n 'A: {(35, A) | (98, 0) | (108, 30) | (553, my_username) | (554, my_password)}'\n\n # Pretty print tag names by using the 't' formatting option\n >>> f\"{logon_msg:t}\"\n 'Logon (A): {MsgType (35): A | EncryptMethod (98): 0 | HeartBtInt (108): 30 | Username (553): my_username | Password (554): my_password}'\n\n # Example of getting the message type\n >>> logon_msg.type\n 'A'\n\n # Example of getting the message type name\n >>> logon_msg.name\n 'Logon'\n\n # Look up the sequence number\n >>> logon_msg.seq_num\n 1\n\n # Various ways for accessing the different fields that make up the message. Fields are just\n # (tag, value) namedtuples.\n >>> logon_msg[108] # Using old school tag number\n Field(108, '30')\n\n >>> logon_msg[Tag.HeartBtInt] # Using the tag name as per the FIX specification\n Field(108, '30')\n\n >>> logon_msg.HeartBtInt # Using tag name shortcut\n Field(108, '30')\n ```\n- A pragmatic [unicode sandwich](https://nedbatchelder.com/text/unipain.html) based approach to encoding / decoding\nmessages mean that you never need to deal with byte sequences directly.\n\n ```python\n from wtfix.message.field import Field\n from wtfix.message.message import generic_message_factory\n\n # Create a new Message from a byte sequence received over the wire\n >>> fields = Field.fields_frombytes(b\"35=A\\x0198=0\\x01108=30\\x01553=my_username\\x01554=my_password\\x01\")\n >>> logon_msg = generic_message_factory(*fields)\n >>> str(logon_msg)\n 'A: {(35, A) | (98, 0) | (108, 30) | (553, my_username) | (554, my_password)}'\n\n # Fields are tuples of (tag, value) pairs\n >>> username = logon_msg.Username\n\n >>> username.tag\n 553\n\n >>> username.value\n \"my_username\"\n\n # Fields behave just like Python's built-in types, and most operations can be performed directly\n # on a field's 'value' attribute.\n >>> username += \"_123\"\n >>> username\n Field(553, 'my_username_123')\n ```\n- Access to the underlying byte sequence when you need it:\n\n ```python\n >>> bytes(logon_msg)\n b'35=A\\x0198=0\\x01108=30\\x01553=my_username\\x01554=my_password\\x01'\n ```\n- It is easy to add Fields to a Message: simply assign the tag value:\n\n ```python\n >>> logon_msg.PossDupFlag = \"Y\"\n >>> f\"{logon_msg:t}\"\n 'Logon (A): {MsgType (35): A | EncryptMethod (98): 0 | HeartBtInt (108): 30 | Username (553): my_username | Password (554): my_password | PossDupFlag (43): Y}'\n\n # Most FIX field values can be cast to their corresponding Python built-in type\n >>> bool(logon_msg.PossDupFlag) is True\n True\n\n ```\n- A very forgiving approach to repeating groups of message tags:\n\n ```python\n from wtfix.protocol.common import Tag, MsgType\n from wtfix.message.message import generic_message_factory\n\n # If you provide a group template, then messages are stored in an 'OrderedDict' for fast lookups\n >>> msg = generic_message_factory((Tag.MsgType, MsgType.ExecutionReport), (Tag.NoMiscFees, 2), (Tag.MiscFeeAmt, 10.00), (Tag.MiscFeeType, 2), (Tag.MiscFeeAmt, 20.00), (Tag.MiscFeeType, \"A\"), group_templates={Tag.NoMiscFees: [Tag.MiscFeeAmt, Tag.MiscFeeType,]})\n >>> msg.data\n OrderedDict([(35, Field(35, '8')), (136, Group(Field(136, '2'), Field(137, '10.0'), Field(139, '2'), Field(137, '20.0'), Field(139, 'A')))])\n\n # Get 'NoMiscFees' group\n >>> group = msg.NoMiscFees\n >>> f\"{group:t}\"\n '[NoMiscFees (136): 2] | [MiscFeeAmt (137): 10.0 | MiscFeeType (139): 2] | [MiscFeeAmt (137): 20.0 | MiscFeeType (139): A]'\n\n # Determine the number of instances in the group\n >>> group.size\n 2\n\n # Retrieve the second group instance\n >>> group.instances[1]\n FieldList(Field(137, '20.0'), Field(139, 'A'))\n\n # Without a pre-defined group template, WTFIX falls back to using a (slightly slower) list structure for representing message fields internally\n >>> msg = generic_message_factory((Tag.MsgType, MsgType.ExecutionReport), (Tag.NoMiscFees, 2), (Tag.MiscFeeAmt, 10.00), (Tag.MiscFeeType, 2), (Tag.MiscFeeAmt, 20.00), (Tag.MiscFeeType, \"A\"))\n >>> msg.data\n [Field(35, '8'), Field(136, '2'), Field(137, '10.0'), Field(139, '2'), Field(137, '20.0'), Field(139, 'A')]\n\n ```\n\n## Getting Started\n\n- Install the project's dependencies (e.g. `pip install -r requirements/local.txt`), preferably in a Python virtual\n environment that has been created specifically for that purpose.\n- Run the test suite with `pytest` to verify the installation.\n- Create a `.env` file in the project's root directory that contains at least the following configuration settings:\n\n ```python\n # Supports different configuration settings for local development, staging, or production environments.\n WTFIX_SETTINGS_MODULE=config.settings.local\n\n HOST= # Required. The FIX server hostname or IP address\n PORT= # Required. The port on the FIX server to connect to\n\n SENDER= # Required. SENDER_COMP_ID (tag 49).\n TARGETD= # Required. TARGET_COMP_ID (tag 56).\n\n USERNAME= # Required. Username to use for Logon messages (tag 553).\n PASSWORD= # Required. Password to use for logon messages (tag 554).\n\n PYTHONASYNCIODEBUG=0 # Set to '1' for detailed debugging messages.\n ```\n\n- Start the FIX client with `python runclient.py`. The default implementation will log in to the FIX server and maintain a steady heartbeat.\n- Use `Ctrl-C` to quit. This will trigger a `Logout` message to be sent before the pipeline is terminated.\n\n## Project Resources\n\n- [Deploying](docs/deploying.md)\n- [Changelog](docs/changelog.md)\n- [Release procedures](docs/releasing.md)\n\n## Inspired By\n\n- [slowbreak](https://pypi.org/project/slowbreak/)'s message processing pipeline and ``@on`` decorator\n- [simplefix](https://github.com/da4089/simplefix)'s approach to raw message parsing\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/jcass77/WTFIX", "keywords": "FIX financial information exchange", "license": "", "maintainer": "", "maintainer_email": "", "name": "wtfix", "package_url": "https://pypi.org/project/wtfix/", "platform": "", "project_url": "https://pypi.org/project/wtfix/", "project_urls": { "Bug Reports": "https://github.com/jcass77/WTFIX/issues", "Homepage": "https://github.com/jcass77/WTFIX", "Source": "https://github.com/jcass77/WTFIX/" }, "release_url": "https://pypi.org/project/wtfix/0.12.4/", "requires_dist": [ "python-dotenv (~=0.10.1)", "unsync (~=1.2)", "flask-restful (~=0.3.7)", "requests (~=2.21.0)", "gunicorn (~=19.9.0)", "aioredis (~=1.2)" ], "requires_python": ">=3.6", "summary": "The Pythonic Financial Information eXchange (FIX) client for humans.", "version": "0.12.4" }, "last_serial": 5771015, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "cdfac64b01ec13cd5c7c2da077340285", "sha256": "52e85a69c1ebad04eba2ab0a77d925a71f8a4e54afd391ca8c48448e18f61466" }, "downloads": -1, "filename": "wtfix-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "cdfac64b01ec13cd5c7c2da077340285", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 52816, "upload_time": "2018-12-11T13:11:32", "url": "https://files.pythonhosted.org/packages/d6/72/66e35b9176af92f8df3389c96c583f51e43f4cefe4863b399e97cd8b672c/wtfix-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b46cf86709c8a0dba447a69a6599afd7", "sha256": "de13caf0e73976611096fa2739da0d7b5c984a2dde957efccd6ad8b8f54f8367" }, "downloads": -1, "filename": "wtfix-0.0.1.tar.gz", "has_sig": false, "md5_digest": "b46cf86709c8a0dba447a69a6599afd7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 39010, "upload_time": "2018-12-11T13:11:35", "url": "https://files.pythonhosted.org/packages/fc/fc/6a08f4ccefd6c07042959a9ba5491d720d77a9cb610af14b202f8fb5d1e2/wtfix-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "021215bd78b7fff0495ee230511c3280", "sha256": "513d3fff2e783e4c15069371d894e62200cd66d63d3c55d311dd9b7b3ee59710" }, "downloads": -1, "filename": "wtfix-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "021215bd78b7fff0495ee230511c3280", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 52580, "upload_time": "2018-12-11T15:00:54", "url": "https://files.pythonhosted.org/packages/dc/12/34aa4c44281554657568885c00d3147335f37b93e56c9fae940499a628a8/wtfix-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f3d073dbde00e0e449b8e684f30e70ea", "sha256": "39064166919906584c5d70485fc87534d600ffce9df62f41e22d349763aacb65" }, "downloads": -1, "filename": "wtfix-0.0.2.tar.gz", "has_sig": false, "md5_digest": "f3d073dbde00e0e449b8e684f30e70ea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 38695, "upload_time": "2018-12-11T15:00:56", "url": "https://files.pythonhosted.org/packages/4d/4e/dbf3d6231861c197528c50594bf3afc50d4486e7b5b1caffbd7ecad88ca0/wtfix-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "148d166ddfb48e9935205cde55590678", "sha256": "78d12eca3013c2cc0a94f67f88f32d864e3463e5d8721d6a9c137d9afd757956" }, "downloads": -1, "filename": "wtfix-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "148d166ddfb48e9935205cde55590678", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 63415, "upload_time": "2019-02-08T11:19:46", "url": "https://files.pythonhosted.org/packages/f4/21/f97067fa61b4da952cb2045ec7fd1148b2eaa99af7a9e9eaf7bcff655c42/wtfix-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca2cd70787659c4c77190025c59b380b", "sha256": "f9c3e1cfe66d83a5a944622b861980f8e50f4bdb91cc34740cec67e33a13184a" }, "downloads": -1, "filename": "wtfix-0.0.3.tar.gz", "has_sig": false, "md5_digest": "ca2cd70787659c4c77190025c59b380b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 48526, "upload_time": "2019-02-08T11:19:48", "url": "https://files.pythonhosted.org/packages/8b/e3/535235e664a46941e6517ecc5cfdfd4e6a45f042d657f6494ab4e861fbe8/wtfix-0.0.3.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "52f0c11f030554db803a20e18769d7d7", "sha256": "057e1165dd2944be8c2ebf767d83b4638382a8454751123fb22781b1fd839406" }, "downloads": -1, "filename": "wtfix-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "52f0c11f030554db803a20e18769d7d7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 90170, "upload_time": "2019-03-05T10:27:15", "url": "https://files.pythonhosted.org/packages/8d/b2/263cef1774e8c648db82805d9f33bc22182ded83ce1473dd5f8586c91c6c/wtfix-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a79b16a39fa2e364f1ec1422d0c5e5b", "sha256": "293a299031527461f43a7b02a39a8fb3ce39e9ae9f370eca3c25e4847bec50bc" }, "downloads": -1, "filename": "wtfix-0.1.0.tar.gz", "has_sig": false, "md5_digest": "2a79b16a39fa2e364f1ec1422d0c5e5b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 55412, "upload_time": "2019-03-05T10:27:17", "url": "https://files.pythonhosted.org/packages/b2/d0/0defcfb6390384b356146842296899e9da890ff1806fae03c2232674f034/wtfix-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "c99a291691ef88b0cb1414c65848bb78", "sha256": "0c4b0830ac1061174b89228bb4435ecfe1d82b47ad2733e72d06c7eec11b2905" }, "downloads": -1, "filename": "wtfix-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c99a291691ef88b0cb1414c65848bb78", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 91106, "upload_time": "2019-03-05T13:13:07", "url": "https://files.pythonhosted.org/packages/33/9c/e0cdfc31a8f1a4add0da2c0f506ce94c263cc937c4046f89a4418b6dcdc9/wtfix-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d3593ef078b96ecca1cced380674ffe1", "sha256": "da102e46b551f9a59e8e5c257c376f5d64d24c1b03cee7bc0c9fffe8fb8c43dd" }, "downloads": -1, "filename": "wtfix-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d3593ef078b96ecca1cced380674ffe1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 56517, "upload_time": "2019-03-05T13:13:09", "url": "https://files.pythonhosted.org/packages/c9/d0/ea42af49c24931d45e12a5da488252a380e4c2f66eac083339876ed37ed5/wtfix-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "16091bbcc4a7767e70c0351f445ea91d", "sha256": "8b203c257c9a31bda4063c720d73ace60fc405176f5bd4b85654c2501220fb3e" }, "downloads": -1, "filename": "wtfix-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "16091bbcc4a7767e70c0351f445ea91d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 91121, "upload_time": "2019-03-05T13:35:31", "url": "https://files.pythonhosted.org/packages/cf/a5/3ee36b45242b838ca0930f27f179349201ce8105e9d38248760bfb259bf0/wtfix-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d0d40277ae10c6d4df9645b94e88a05d", "sha256": "be5c39140f1c78f283b9489ef27fbca423fcdefdf024fa2bcaf1e797b046d9a9" }, "downloads": -1, "filename": "wtfix-0.1.2.tar.gz", "has_sig": false, "md5_digest": "d0d40277ae10c6d4df9645b94e88a05d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 56529, "upload_time": "2019-03-05T13:35:33", "url": "https://files.pythonhosted.org/packages/15/43/3e5598ad91f8c85dffa36380c5625d8f5b78dd63648bcd0c5291c17400af/wtfix-0.1.2.tar.gz" } ], "0.10.0": [ { "comment_text": "", "digests": { "md5": "01978173835885dbce245887770b5e5f", "sha256": "b932083f9880752a8adf4df3e922bbd005468fe4da793a387f2a390e266670cc" }, "downloads": -1, "filename": "wtfix-0.10.0-py3-none-any.whl", "has_sig": false, "md5_digest": "01978173835885dbce245887770b5e5f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 124288, "upload_time": "2019-05-13T04:13:28", "url": "https://files.pythonhosted.org/packages/1b/e7/c31a3866b163c4b259c533793457e95776ac4d60cd93140149489e8428b9/wtfix-0.10.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d39992335881775f02a05b3e0c7dade3", "sha256": "cf5daf7336bcc9341533cbc2b4aac9613de4bccb9e856f224db8df204196ee69" }, "downloads": -1, "filename": "wtfix-0.10.0.tar.gz", "has_sig": false, "md5_digest": "d39992335881775f02a05b3e0c7dade3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 80530, "upload_time": "2019-05-13T04:13:30", "url": "https://files.pythonhosted.org/packages/aa/e6/c295b161f02160ee67bd528849ef7c6097fc184095ffaffba0145ce17547/wtfix-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "c12b5334234ba95bd2708ee6e78ee438", "sha256": "aab3a20828159ca77fa03dec3b30ee166dd00d2d4de3a626bd2a36ac8f1b428b" }, "downloads": -1, "filename": "wtfix-0.11.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c12b5334234ba95bd2708ee6e78ee438", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 124630, "upload_time": "2019-05-27T13:08:11", "url": "https://files.pythonhosted.org/packages/04/65/250201372535cb1a8dedac7fde5096f0cec95d4cee1c3020e931b02a64c0/wtfix-0.11.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef2dffc2bb7668c913405a72e7ce98f8", "sha256": "5a2a2f36270d4560de0bd59d1090ac37c3465225596fde0bbd21d017822382da" }, "downloads": -1, "filename": "wtfix-0.11.0.tar.gz", "has_sig": false, "md5_digest": "ef2dffc2bb7668c913405a72e7ce98f8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 80763, "upload_time": "2019-05-27T13:08:13", "url": "https://files.pythonhosted.org/packages/ad/99/44c617ddd5319e402ed9578c8c9d020af542ea22f2edb99de0b023e4d451/wtfix-0.11.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "bd182e077110da4e74d3d10f1107979b", "sha256": "029377a04e53b3fa0ba101d2d6d5308895f236767088e8ad1b8d18862dcdb464" }, "downloads": -1, "filename": "wtfix-0.12.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bd182e077110da4e74d3d10f1107979b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 125514, "upload_time": "2019-06-06T12:40:19", "url": "https://files.pythonhosted.org/packages/1d/a0/40d074414914420cac78f460364dcd18a535feb1211d04f1e452e28a87ee/wtfix-0.12.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91fecf970d421af17e01b4a2b6d863e0", "sha256": "3195d873f623aa67fb51827e6b149940c8f3c7e99964250bd43a58fc53595c12" }, "downloads": -1, "filename": "wtfix-0.12.0.tar.gz", "has_sig": false, "md5_digest": "91fecf970d421af17e01b4a2b6d863e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 81656, "upload_time": "2019-06-06T12:40:22", "url": "https://files.pythonhosted.org/packages/12/47/7012275db61ec52a2dabe7bd25f76cad4ca34aaaeec0f4eb13de50dda92a/wtfix-0.12.0.tar.gz" } ], "0.12.1": [ { "comment_text": "", "digests": { "md5": "2dae41ac749a7f5ded57e6d9cdabe90d", "sha256": "b5adebdfb201ca9c88103d3e4fd8519de2125c22552abfa5dde0b8e532fb40fd" }, "downloads": -1, "filename": "wtfix-0.12.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2dae41ac749a7f5ded57e6d9cdabe90d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 126022, "upload_time": "2019-07-04T05:36:20", "url": "https://files.pythonhosted.org/packages/22/6c/974b48c46cce6f07a613196ee1d9dc228944fe3e04d94ebd56045e271e3b/wtfix-0.12.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c3c604ce41bd8612f76bdf8165dfc7d", "sha256": "d16002b1e27f2438ad4cb11eee0f68ee4b04bcf28d7f6cc477e5b21c294e35b6" }, "downloads": -1, "filename": "wtfix-0.12.1.tar.gz", "has_sig": false, "md5_digest": "4c3c604ce41bd8612f76bdf8165dfc7d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 82087, "upload_time": "2019-07-04T05:36:23", "url": "https://files.pythonhosted.org/packages/5a/60/3f4fb534728721c593506a299c9ea9a4be9eba978154612d0326cd7330bd/wtfix-0.12.1.tar.gz" } ], "0.12.2": [ { "comment_text": "", "digests": { "md5": "5e75a9743850e0825d4699e711db56d6", "sha256": "b4b3595f9b4693101be46693c15941bffbdc3d7ec22f7107af2691b76abef9ca" }, "downloads": -1, "filename": "wtfix-0.12.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5e75a9743850e0825d4699e711db56d6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 126030, "upload_time": "2019-07-04T07:42:29", "url": "https://files.pythonhosted.org/packages/18/be/02bc7e7e8e7a7cbfe2ada8ea44c2a51f43fd15d49de410e7edf2ecab1175/wtfix-0.12.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5f43e1643be877c1235c7b6c70191c7c", "sha256": "80fe544741041a88968a87dd0a0a6ab1bf5cd2c9a57a90e5989afab970bb7f2f" }, "downloads": -1, "filename": "wtfix-0.12.2.tar.gz", "has_sig": false, "md5_digest": "5f43e1643be877c1235c7b6c70191c7c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 82108, "upload_time": "2019-07-04T07:42:31", "url": "https://files.pythonhosted.org/packages/0c/d2/69ddf9b0cfbca10e2240501796bf6210543f131759a93a00159d4e119542/wtfix-0.12.2.tar.gz" } ], "0.12.3": [ { "comment_text": "", "digests": { "md5": "210ce25526b0ce84780c35ff03fb996f", "sha256": "578004837071a5cd78254b1940c4b6a049d390351e37e787b63b7a4e8c07830a" }, "downloads": -1, "filename": "wtfix-0.12.3-py3-none-any.whl", "has_sig": false, "md5_digest": "210ce25526b0ce84780c35ff03fb996f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 126023, "upload_time": "2019-07-04T11:21:15", "url": "https://files.pythonhosted.org/packages/be/30/f0c85914033db17633717916ef93293c13679a2dd02d62f25650c00eff4d/wtfix-0.12.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d80fb44960f5cc5964ed57601ce99bd0", "sha256": "ee1bf31449f8a06535e312a6d943460eb63f5e5f12bbd20f638ea64b90439761" }, "downloads": -1, "filename": "wtfix-0.12.3.tar.gz", "has_sig": false, "md5_digest": "d80fb44960f5cc5964ed57601ce99bd0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 82131, "upload_time": "2019-07-04T11:21:18", "url": "https://files.pythonhosted.org/packages/56/fb/c420b0f17b2f89ec5a0fc7c7705a3128f06950a130cd6e389c5eeeba9428/wtfix-0.12.3.tar.gz" } ], "0.12.4": [ { "comment_text": "", "digests": { "md5": "db97c3ba29ec7eb46128ca8a949365a9", "sha256": "e17ca900c1e554d058e7ea607f2e56aabedaeca2d586850fa1351fd18adb0995" }, "downloads": -1, "filename": "wtfix-0.12.4-py3-none-any.whl", "has_sig": false, "md5_digest": "db97c3ba29ec7eb46128ca8a949365a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 126022, "upload_time": "2019-09-02T14:05:08", "url": "https://files.pythonhosted.org/packages/bb/5d/f1283c088a9fd24c6666716ed2b0558adb4be3ad1e8347c1cf7a4683927d/wtfix-0.12.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3704ca8cb7ec79298b1ba092b0d7fd01", "sha256": "d67e138ffdd86348e9fe981372f5b5b4805aa30b7ea49b3106685c5894abe8e0" }, "downloads": -1, "filename": "wtfix-0.12.4.tar.gz", "has_sig": false, "md5_digest": "3704ca8cb7ec79298b1ba092b0d7fd01", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 82128, "upload_time": "2019-09-02T14:05:11", "url": "https://files.pythonhosted.org/packages/d1/cd/b70bce55426cc973ff28e7afa147f66ed17f211fd3cf301e4442c8e3dbe3/wtfix-0.12.4.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "8538afd16e16eb5ede0b876dac075491", "sha256": "806d988f60177e68a35f005f5f68f60f1c7e90e59223f9f8d8c66c0c4d68a4e0" }, "downloads": -1, "filename": "wtfix-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8538afd16e16eb5ede0b876dac075491", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 97787, "upload_time": "2019-03-10T07:03:29", "url": "https://files.pythonhosted.org/packages/fe/4c/f1ff6d729481921ac62b07de236981ec90ddc3d79df5c5d757670f73dd10/wtfix-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "abe10d87bc2b7bec0d034f3388e51d3c", "sha256": "d81062864dc054d6af0f28b9dcedb99491fded067cc8496f280663be12118eb4" }, "downloads": -1, "filename": "wtfix-0.2.0.tar.gz", "has_sig": false, "md5_digest": "abe10d87bc2b7bec0d034f3388e51d3c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 60566, "upload_time": "2019-03-10T07:03:31", "url": "https://files.pythonhosted.org/packages/0d/15/e4cf9a12c52fb4210115733b8b3c226d94e3c46a9aa5ce91a131d92d226b/wtfix-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "6db0bc70305f997b21758cde84d11397", "sha256": "639622dced4764ab45426599ce5de54120cec86bc6874219e3c7e85d2079790b" }, "downloads": -1, "filename": "wtfix-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6db0bc70305f997b21758cde84d11397", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 99396, "upload_time": "2019-03-10T15:50:48", "url": "https://files.pythonhosted.org/packages/9c/40/3be379e2cf4204c326b441b09b6299c4ba67f17375a854e9b63dbbfee0bc/wtfix-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c9a3e9e56f3fb702337b43228000ee2a", "sha256": "701deb7d72cf28e2c0c9047132fadf2f99ee4bf730a8236abc32e4a99a71aa65" }, "downloads": -1, "filename": "wtfix-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c9a3e9e56f3fb702337b43228000ee2a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 60211, "upload_time": "2019-03-10T15:50:50", "url": "https://files.pythonhosted.org/packages/5c/f1/ac3a99e8ef91cacca2bd637a9d43dd8734ed2cdcbca5bd3f9c9ab2909051/wtfix-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "d3de061495838dcc4d285fe1c0f7539a", "sha256": "210c2162b469499be9bb8d31f72878bcef2d21b4ee1ca35b08ddb7ea245c6928" }, "downloads": -1, "filename": "wtfix-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d3de061495838dcc4d285fe1c0f7539a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 103897, "upload_time": "2019-03-12T15:01:32", "url": "https://files.pythonhosted.org/packages/ed/5a/63182c348ceb56cc2bc722cbbdbc12b6db1790cd981936e040a9730f78a5/wtfix-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c0d4417fe66871bc4ff051a9451d120e", "sha256": "2cf091eb7f32d18f3318e85ab41fac38b063911abb4240352fc694cdf1dd36c8" }, "downloads": -1, "filename": "wtfix-0.4.0.tar.gz", "has_sig": false, "md5_digest": "c0d4417fe66871bc4ff051a9451d120e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 62113, "upload_time": "2019-03-12T15:01:34", "url": "https://files.pythonhosted.org/packages/fd/8a/b920d29a1f740cc4c76f7ac115730e568db61cfa7bb188b07e3c385604e9/wtfix-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "f32b62cf98297e408dcfb06e69127613", "sha256": "2197cdae31d626f2b0768dbd9191c1bd68b115cb1ffdc73d0bb9695054f5da75" }, "downloads": -1, "filename": "wtfix-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f32b62cf98297e408dcfb06e69127613", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 103864, "upload_time": "2019-03-15T07:38:00", "url": "https://files.pythonhosted.org/packages/aa/e5/e0a49a230008e278a9fcdd870e7817fa730d675514278b24e75083cb5633/wtfix-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27abbd7f4566f0465e41901bb1d195e7", "sha256": "c8c93bddc5ca94e3693e2d8dfe8c36b1f0bef33e9a5b5dc2ca5f75f78ebbb826" }, "downloads": -1, "filename": "wtfix-0.5.0.tar.gz", "has_sig": false, "md5_digest": "27abbd7f4566f0465e41901bb1d195e7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 62138, "upload_time": "2019-03-15T07:38:02", "url": "https://files.pythonhosted.org/packages/d8/30/f4fb64b6286cc54e19829fc361f5eeedea8a9ec2647679bff0cf19595f99/wtfix-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "b3266dc31c26f8e28c1c0096261a5b8a", "sha256": "0359e7ba7ddee5797864917548c3486fe849ab6ebe75da8669de5b8582bc8a01" }, "downloads": -1, "filename": "wtfix-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b3266dc31c26f8e28c1c0096261a5b8a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 109248, "upload_time": "2019-04-01T09:44:54", "url": "https://files.pythonhosted.org/packages/a0/93/baf37b0d94408999d179d246483388703c874498cc878b51129013b0c3e8/wtfix-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b737f57255327e5623595b4be115b024", "sha256": "dec04e44e7d935302611b80b1bc143178ee7ec4d820e824b2b28fbf0fbd4162e" }, "downloads": -1, "filename": "wtfix-0.6.0.tar.gz", "has_sig": false, "md5_digest": "b737f57255327e5623595b4be115b024", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 70733, "upload_time": "2019-04-01T09:44:56", "url": "https://files.pythonhosted.org/packages/04/a2/a7fbced0f0a3a4ffdb0b89146cbf188a999cb8da36e1b83df433f16cf082/wtfix-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "8a56aba7b39dfe467823243d1383060c", "sha256": "320f59a112f154e30be8412d89b5e0e487789a9d34451fedb2b8db58178a2ef0" }, "downloads": -1, "filename": "wtfix-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8a56aba7b39dfe467823243d1383060c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 114654, "upload_time": "2019-04-21T13:31:37", "url": "https://files.pythonhosted.org/packages/65/7c/601d17738792a0ff87d319f472943f1f65c04621ec66603073a40b4f6715/wtfix-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7bd3d27f5074aea0307211f1c934f552", "sha256": "78ab9ef009cc8a27dc0f33320aab0280e7d6d8a6d4b7b21b06b3b0a14c3119c9" }, "downloads": -1, "filename": "wtfix-0.7.0.tar.gz", "has_sig": false, "md5_digest": "7bd3d27f5074aea0307211f1c934f552", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 73083, "upload_time": "2019-04-21T13:31:39", "url": "https://files.pythonhosted.org/packages/26/03/64d8aacbda11670a4685393c102f5fd1b600e4be41499ffe2f7845fc938f/wtfix-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "d6402af93e9082872e00152d106d4f3f", "sha256": "6e98b65ed83e10811d94e2eccdf2bf0cd9705bb7867c75cc7e6bf4e48dd52a60" }, "downloads": -1, "filename": "wtfix-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d6402af93e9082872e00152d106d4f3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 122229, "upload_time": "2019-04-30T12:08:57", "url": "https://files.pythonhosted.org/packages/9f/b2/e6a02d9e43f26e7e4f19a0614befb7544a2f402bdd5a03120634dfe102c9/wtfix-0.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a2a72c9b1b180de0e03070c542690739", "sha256": "68f80e2a2b28995dca5886354c8027476e25e6586b868fba720b0cde121cbb74" }, "downloads": -1, "filename": "wtfix-0.8.0.tar.gz", "has_sig": false, "md5_digest": "a2a72c9b1b180de0e03070c542690739", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 79245, "upload_time": "2019-04-30T12:09:03", "url": "https://files.pythonhosted.org/packages/71/cf/7dbce9ab47b480af154da03bf69ab609068bb1d09d4780871f56f1bba26e/wtfix-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "ac676fbbd6fa9c7334fdb43dc80dee97", "sha256": "df20a4a62be44d5d814bad22246c22c6a5f1bb9e78206da869fd1eb9cb2f85c6" }, "downloads": -1, "filename": "wtfix-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ac676fbbd6fa9c7334fdb43dc80dee97", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 123813, "upload_time": "2019-05-02T14:14:52", "url": "https://files.pythonhosted.org/packages/b6/2a/65070c0592252a0cf018b73ce5839915e14adfb7ab4c13f9ab7644a1050b/wtfix-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e191ea33e6e0929c9ecfdab7fbc6f602", "sha256": "60ff8fcd8ce0d3ce450858f22934fd9cd680951470ae5ae7f8282816370a649f" }, "downloads": -1, "filename": "wtfix-0.9.0.tar.gz", "has_sig": false, "md5_digest": "e191ea33e6e0929c9ecfdab7fbc6f602", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 80001, "upload_time": "2019-05-02T14:14:55", "url": "https://files.pythonhosted.org/packages/3d/db/e6838571eee89338760ed209844b4ccb06c6aeeb9b0b50dcb1a34cdc321b/wtfix-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "db97c3ba29ec7eb46128ca8a949365a9", "sha256": "e17ca900c1e554d058e7ea607f2e56aabedaeca2d586850fa1351fd18adb0995" }, "downloads": -1, "filename": "wtfix-0.12.4-py3-none-any.whl", "has_sig": false, "md5_digest": "db97c3ba29ec7eb46128ca8a949365a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 126022, "upload_time": "2019-09-02T14:05:08", "url": "https://files.pythonhosted.org/packages/bb/5d/f1283c088a9fd24c6666716ed2b0558adb4be3ad1e8347c1cf7a4683927d/wtfix-0.12.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3704ca8cb7ec79298b1ba092b0d7fd01", "sha256": "d67e138ffdd86348e9fe981372f5b5b4805aa30b7ea49b3106685c5894abe8e0" }, "downloads": -1, "filename": "wtfix-0.12.4.tar.gz", "has_sig": false, "md5_digest": "3704ca8cb7ec79298b1ba092b0d7fd01", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 82128, "upload_time": "2019-09-02T14:05:11", "url": "https://files.pythonhosted.org/packages/d1/cd/b70bce55426cc973ff28e7afa147f66ed17f211fd3cf301e4442c8e3dbe3/wtfix-0.12.4.tar.gz" } ] }