{ "info": { "author": "Mike Kazantsev", "author_email": "mk.fraggod@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Environment :: No Input/Output (Daemon)", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "Intended Audience :: Telecommunications Industry", "License :: Public Domain", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 2 :: Only", "Topic :: Communications", "Topic :: Internet", "Topic :: System :: Archiving", "Topic :: Utilities" ], "description": "python-libraptorq\n=================\n\nPython 2.X CFFI_ bindings for libRaptorQ_ v0.1.x - C++11 implementation of\nRaptorQ Forward Error Correction codes, as described in RFC6330_.\n\n**Warning**: Using libRaptorQ RFC6330 API (which this module wraps around)\nproperly requires knowledge of some concepts and parameters described in that\nRFC, and not using correct ones may result in undecodable data!\nSee \"Usage\" section below for more details.\n\n**Warning**: As far as I know (not a lawyer), there are lots of patents around\nthe use of this technology, which might be important for any high-profile and\ncommercial projects, especially in US and Canada.\n\n|\n\n.. contents::\n :backlinks: none\n\n.. _CFFI: http://cffi.readthedocs.org/\n.. _libRaptorQ: https://www.fenrirproject.org/Luker/libRaptorQ/wikis/home\n.. _RFC6330: https://tools.ietf.org/html/rfc6330\n\n\n\nGeneral info\n------------\n\nQuoting `wikipedia on Raptor code`_:\n\n Raptor codes, as with fountain codes in general, encode a given message\n consisting of a number of symbols, k, into a potentially limitless sequence of\n encoding symbols such that knowledge of any k or more encoding symbols allows\n the message to be recovered with some non-zero probability.\n\n Raptor (\"RAPid TORnado\") codes are the first known class of fountain codes\n with linear time encoding and decoding.\n\nAnd RFC6330_:\n\n RaptorQ codes are a new family of codes that provide superior flexibility,\n support for larger source block sizes, and better coding efficiency than\n Raptor codes in RFC 5053.\n\n ... in most cases, a set of cardinality equal to the number of source symbols\n is sufficient; in rare cases, a set of cardinality slightly more than the\n number of source symbols is required.\n\nIn practice this means that source data block of size 1 MiB (for example) can\n(with very high probability) be recovered from any 1.002 MiB of the received\nsymbols for it (from `\"Application Layer Forward Error Correction for Mobile\nMultimedia Broadcasting Case Study\" paper`_).\n\nNote that being a probablilistic algorithm, RaptorQ can have highly-improbable\npathological cases and be exploited through these e.g. by dropping specific data\nblocks (see `\"Stopping a Rapid Tornado with a Puff\" paper`_ for more details).\n\nEncoded data will be roughly same size as original plus the \"repair symbols\",\ni.e. almost no size overhead, except for what is intentionally generated.\n\n.. _wikipedia on Raptor code: https://en.wikipedia.org/wiki/Raptor_code\n.. _\"Application Layer Forward Error Correction for Mobile Multimedia Broadcasting Case Study\" paper:\n https://www.qualcomm.com/media/documents/files/raptor-codes-for-mobile-multimedia-broadcasting-case-study.pdf\n.. _\"Stopping a Rapid Tornado with a Puff\" paper: http://jmsalopes.com/pubs/sp.pdf\n\n\n\nUsage\n-----\n\nModule includes command-line script (\"rq\", when installed or as symlink in the\nrepo), which has example code for both encoding and decoding, and can be used as\na standalone tool, or for basic algorithm testing/showcase.\n\nCan also be used from command-line via ``python2 -m libraptorq ...`` invocation\n(when installed as module), e.g. ``python2 -m libraptorq --help``.\n\n**Important**: With current 0.1.x libRaptorQ API, specifying unsuitable\nparameters for encoding, such as having symbol_size=16 and max_memory=200 for\nencoding 200K+ of data WILL result in **silently** producing encoded data that\n**cannot be decoded**.\n\n\nCommand-line script\n'''''''''''''''''''\n\nTo encode file, with 50% extra symbols (resulting indivisible data chunks to be\nstored/transmitted intact or lost entirely) and 30% of total from these (K\nrequired symbols + X repair symbols) dropped (just for testing purposes) before\nsaving them to \"setup.py.enc\"::\n\n % ./rq --debug encode -s16 -m200 --repair-symbols-rate 0.5 --drop-rate 0.3 setup.py setup.py.enc\n Initialized RQEncoder (0.063s)...\n Precomputed blocks (0.002s)...\n Finished encoding symbols (9 blocks, 0.008s)...\n Closed RQEncoder (0.002s)...\n Encoded 1,721 B into 167 symbols (needed: >108, repair rate: 50%),\n 45 dropped (30%), 122 left in output (1,952 B without ids)\n\nDecode original file back from these::\n\n % ./rq --debug decode setup.py.enc setup.py.dec\n Initialized RQDecoder (0.064s)...\n Decoded enough symbols to recover data (0.010s)...\n Closed RQDecoder (0.002s)...\n Decoded 1,721 B of data from 108 processed symbols (1,728 B without ids, symbols total: 122)\n\n % sha256sum -b setup.py{,.dec}\n 36c50348459b51821a2715b0f5c4ef08647d66f77a29913121af4f0f4dfef454 *setup.py\n 36c50348459b51821a2715b0f5c4ef08647d66f77a29913121af4f0f4dfef454 *setup.py.dec\n\nNo matter which chunks are dropped (get picked by ``random.choice``), file\nshould be recoverable from output as long as number of chunks left (in each\n\"block\") is slightly (by ~0.02%) above K.\n\nOutput data (\"setup.py.enc\" in the example) for the script is JSON-encoded list\nof base64-encoded symbols, as well as some parameters for lib init\n(``oti_scheme``, ``oti_common``). input data length and sha256 hash of source\ndata to make sure that decoded data is same as original (or exit with error\notherwise).\n\nSee output with --help option for all the other script parameters.\n\nPython module\n'''''''''''''\n\nTo use as a python2 module::\n\n from libraptorq import RQEncoder\n\n data = 'some input string' * 500\n\n # Data size must be divisible by RQEncoder.data_size_div\n data_len, n = len(data), RQEncoder.data_size_div\n if data_len % n: data += '\\0' * (n - data_len % n)\n\n with RQEncoder(data, min_subsymbol_size=4, symbol_size=16, max_memory=200) as enc:\n\n symbols = dict()\n oti_scheme, oti_common = enc.oti_scheme, enc.oti_common\n\n for block in enc:\n symbols.update(block.encode_iter(repair_rate=0))\n\n data_encoded = data_len, oti_scheme, oti_common, symbols\n\n``oti_scheme`` and ``oti_common`` are two integers specifying encoder options,\nneeded to initialize decoder, which can be hard-coded (if constant) on both ends.\n\n``block.encode_iter()`` can be used without options to produce max possible\namount of symbols, up to ``block.symbols + block.max_repair``.\nAbove example only produces K symbols - min amount required.\n\nFor decoding (reverse operation)::\n\n from libraptorq import RQDecoder\n\n data_len, oti_scheme, oti_common, symbols = data_encoded\n\n with RQDecoder(oti_common, oti_scheme) as dec:\n for sym_id, sym in symbols.viewitems(): dec.add_symbol(sym, sym_id)\n\n data = dec.decode()[:data_len]\n\nNote that in practice, e.g. when transmitting each symbol in a udp packet, one'd\nwant to send something like ``sym_id || sym_data || checksum``, and keep sending\nthese from ``block.encode_iter()`` until other side acknowledges that it can\ndecode a block (i.e. enough symbols received, see ``RQDecoder.decode_block()``),\nthen start streaming the next block in similar fashion.\n\nSee `__main__.py\n`_\nfile (cli script) for an extended example, and libRaptorQ_ docs for info on its\nC API, which this module wraps around.\n\n\n\nInstallation\n------------\n\nIt's a regular package for Python 2.7 (not 3.X).\n\nIt uses and needs CFFI_ (can/should be installed by pip_) and libRaptorQ_ v0.1.x\ninstalled (as libRaptorQ.so) on the system.\n\nlibRaptorQ v1.x (as opposed to current stable version 0.1.9) has different API\nand **will not** work with this module.\n\nUsing pip_ is the best way::\n\n % pip install libraptorq\n\nIf you don't have it, use::\n\n % easy_install pip\n % pip install libraptorq\n\nAlternatively (see also `pip2014.com`_ and `pip install guide`_)::\n\n % curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2\n % pip install libraptorq\n\nOr, if you absolutely must::\n\n % easy_install libraptorq\n\nBut, you really shouldn't do that.\n\nCurrent-git version can be installed like this::\n\n % pip install 'git+https://github.com/mk-fg/python-libraptorq.git#egg=libraptorq'\n\nNote that to install stuff in system-wide PATH and site-packages, elevated\nprivileges are often required.\nUse \"install --user\", `~/.pydistutils.cfg`_ or virtualenv_ to do unprivileged\ninstalls into custom paths.\n\nAlternatively, ``./rq`` tool can be run right from the checkout tree without any\ninstallation, if that's the only thing you need there.\n\n.. _pip: http://pip-installer.org/\n.. _pip2014.com: http://pip2014.com/\n.. _pip install guide: http://www.pip-installer.org/en/latest/installing.html\n.. _~/.pydistutils.cfg: http://docs.python.org/install/index.html#distutils-configuration-files\n.. _virtualenv: http://pypi.python.org/pypi/virtualenv\n\n\n\nRandom Notes\n------------\n\n* See `github-issue-1`_ for more info on what happens when encoding parameters\n (such as symbol_size and max_memory) are specified carelessly, and why\n command-line interface of this module does not have defaults for these.\n\n* libRaptorQ is currently used via CFFI in \"ABI Mode\" to avoid any extra hassle\n with compilation and the need for compiler, see `CFFI docs on the subject`_\n for more info on what it means.\n\n* When decoding, libRaptorQ can raise errors for ``add_symbol()`` calls, when\n source block is already decoded and that extra symbol is not needed.\n\n* libRaptorQ allows to specify \"rq_type\" parameter for internal data alignment\n size (C++ iterator element), which is hard-coded to RQ_ENC_32/RQ_DEC_32\n in the module, for simplicity.\n\n* Lack of Python 3.X compatibility is due to me not using it at all (yet?), so\n don't need it, have nothing against it in principle.\n\n.. _github-issue-1: https://github.com/mk-fg/python-libraptorq/issues/1\n.. _CFFI docs on the subject: https://cffi.readthedocs.org/en/latest/cdef.html\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/mk-fg/python-libraptorq", "keywords": "fec", "license": "WTFPL", "maintainer": "", "maintainer_email": "", "name": "libraptorq", "package_url": "https://pypi.org/project/libraptorq/", "platform": "", "project_url": "https://pypi.org/project/libraptorq/", "project_urls": { "Homepage": "http://github.com/mk-fg/python-libraptorq" }, "release_url": "https://pypi.org/project/libraptorq/18.3.0/", "requires_dist": null, "requires_python": "", "summary": "Python CFFI bindings for libRaptorQ (RaptorQ RFC6330 FEC implementation).", "version": "18.3.0" }, "last_serial": 3642970, "releases": { "15.12.10": [ { "comment_text": "", "digests": { "md5": "8dfd29c8dc061f85eee42b5fc15089d4", "sha256": "0f98a916138de1f95a12c653d01bb0fda24f1f40ee24a83a3c074f3090deb371" }, "downloads": -1, "filename": "libraptorq-15.12.10.tar.gz", "has_sig": false, "md5_digest": "8dfd29c8dc061f85eee42b5fc15089d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10506, "upload_time": "2015-12-16T14:47:06", "url": "https://files.pythonhosted.org/packages/c9/5a/9e92d4a3082aaa48a7d45593229466ce92d73f3f24685a04213eacecfd68/libraptorq-15.12.10.tar.gz" } ], "15.12.11": [ { "comment_text": "", "digests": { "md5": "1d3944fbc127c5d144efb8096308f0e6", "sha256": "9e9e3bbfadb21fff969f90cdebd0ed0f7fadb0a890eb94f38358cdfd02435527" }, "downloads": -1, "filename": "libraptorq-15.12.11.tar.gz", "has_sig": false, "md5_digest": "1d3944fbc127c5d144efb8096308f0e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10585, "upload_time": "2015-12-16T17:11:04", "url": "https://files.pythonhosted.org/packages/ae/8f/2a14e8042853b72d97819926fc3a9f8d2bf540b3282a211781540d08f2d9/libraptorq-15.12.11.tar.gz" } ], "15.12.12": [ { "comment_text": "", "digests": { "md5": "2d8a6527f358bde65e5b4c47acea017e", "sha256": "de9c5b0f279dfe847b1117262db8371b5856be1f734c47af5decae3b1beb4cb9" }, "downloads": -1, "filename": "libraptorq-15.12.12.tar.gz", "has_sig": false, "md5_digest": "2d8a6527f358bde65e5b4c47acea017e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10600, "upload_time": "2015-12-17T11:19:18", "url": "https://files.pythonhosted.org/packages/43/e9/c6dfc7492dcb1a3360aedd6d6d13253bf30aca161ae9bbe129d6b85c0ec4/libraptorq-15.12.12.tar.gz" } ], "15.12.3": [ { "comment_text": "", "digests": { "md5": "8ddbbd88785ccffca40f3328701a9e18", "sha256": "24d503ff9efd083b9f08338e7b52fb34bce3379cd5ebcf7bc0343a3a535382bb" }, "downloads": -1, "filename": "libraptorq-15.12.3.tar.gz", "has_sig": false, "md5_digest": "8ddbbd88785ccffca40f3328701a9e18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8771, "upload_time": "2015-12-14T22:39:50", "url": "https://files.pythonhosted.org/packages/00/1e/ae4699ec0de71115aaa13c4ca09990d926e5eb1aef3e6d8ab1b7c2630927/libraptorq-15.12.3.tar.gz" } ], "15.12.5": [ { "comment_text": "", "digests": { "md5": "8a4fd26412558c703e5f567efe65090b", "sha256": "cd944c7a3d40c23ec6193c3232d02f9bb6dbccb5fe3895ae62ffc467e171b8f0" }, "downloads": -1, "filename": "libraptorq-15.12.5.tar.gz", "has_sig": false, "md5_digest": "8a4fd26412558c703e5f567efe65090b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8842, "upload_time": "2015-12-15T11:44:57", "url": "https://files.pythonhosted.org/packages/76/f3/d6b2357eccb79651a9b77617d5949f825b9d0917f82054950f76adb4188a/libraptorq-15.12.5.tar.gz" } ], "15.12.6": [ { "comment_text": "", "digests": { "md5": "1aa52b21c8430ee1e630fe28e6b58a77", "sha256": "e0b137687dd8e79dcaaded898d79eb64ac50013eb2d4ffeaa790c6a2013a3b5f" }, "downloads": -1, "filename": "libraptorq-15.12.6.tar.gz", "has_sig": false, "md5_digest": "1aa52b21c8430ee1e630fe28e6b58a77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9411, "upload_time": "2015-12-15T12:11:58", "url": "https://files.pythonhosted.org/packages/f0/9d/f2a90e1d8c490a0b6115859ee2d1fbff54cd043f19a48a44cadddc525e7c/libraptorq-15.12.6.tar.gz" } ], "15.12.7": [ { "comment_text": "", "digests": { "md5": "80efde6f5ba97a3e4b9835a12b1ddde6", "sha256": "27c71f991c5f105e31c4877e69bce4d2048efddbeb24b9f9d0ba54af56d60a70" }, "downloads": -1, "filename": "libraptorq-15.12.7.tar.gz", "has_sig": false, "md5_digest": "80efde6f5ba97a3e4b9835a12b1ddde6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10457, "upload_time": "2015-12-16T11:45:41", "url": "https://files.pythonhosted.org/packages/37/9f/333cac67dd6945bb550f8f3b1dd67340653bb6758dc820338c5e8fe14434/libraptorq-15.12.7.tar.gz" } ], "15.12.8": [ { "comment_text": "", "digests": { "md5": "b8201b1e7ef6e3d7d2e949830f034b47", "sha256": "f936591ad34b1aa14f3105c038abc303fba6ed0478a52a938eaa7331a22ebae3" }, "downloads": -1, "filename": "libraptorq-15.12.8.tar.gz", "has_sig": false, "md5_digest": "b8201b1e7ef6e3d7d2e949830f034b47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10502, "upload_time": "2015-12-16T11:49:01", "url": "https://files.pythonhosted.org/packages/9e/9a/3cfaa98988be075b55a6bf5627c04e8ac2419fd68373fe80452e094d54c5/libraptorq-15.12.8.tar.gz" } ], "16.2.1": [ { "comment_text": "", "digests": { "md5": "9824cc5e151d185d273e9211d89471f5", "sha256": "7171b02f9aa85723e006c7fd4f67a1bb7909f8f6eadc3e049300c05be883bb79" }, "downloads": -1, "filename": "libraptorq-16.2.1.tar.gz", "has_sig": false, "md5_digest": "9824cc5e151d185d273e9211d89471f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10801, "upload_time": "2016-02-24T22:41:46", "url": "https://files.pythonhosted.org/packages/22/84/19410202cebc9cb64dfb5490056a8ef7155a307169bfd5c741ba8e6cc987/libraptorq-16.2.1.tar.gz" } ], "16.2.2": [ { "comment_text": "", "digests": { "md5": "bdf5b432e2e6331c5b01840847fc858a", "sha256": "02e3c0461fbfc736218e4b2fd818e3564e5d9860e1f509fe1b8991ffe310275b" }, "downloads": -1, "filename": "libraptorq-16.2.2.tar.gz", "has_sig": false, "md5_digest": "bdf5b432e2e6331c5b01840847fc858a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10798, "upload_time": "2016-02-24T22:43:25", "url": "https://files.pythonhosted.org/packages/d4/e4/e68e7f0656a8311db4fe23b102ed19a508f7aa0727225b7b8d252458369e/libraptorq-16.2.2.tar.gz" } ], "16.2.3": [ { "comment_text": "", "digests": { "md5": "a4a63398b8ad8307d28783a43cee34bf", "sha256": "7a05be23fd38a5443ee2d9a3156f0387bbae5fd5687e1de6249591cb50d13dbf" }, "downloads": -1, "filename": "libraptorq-16.2.3.tar.gz", "has_sig": false, "md5_digest": "a4a63398b8ad8307d28783a43cee34bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11125, "upload_time": "2016-02-24T23:13:55", "url": "https://files.pythonhosted.org/packages/9d/7a/bd2e960031c4c48dcb66cec207d4fb22fbd8a58945d34de7d5c469234ec0/libraptorq-16.2.3.tar.gz" } ], "16.2.4": [ { "comment_text": "", "digests": { "md5": "591b654924f3cd115d9dd2a0e03325ec", "sha256": "a8b7965092fb94c6a192b32a3adc19ee15c691bb35acfb3edb3f63e1cb6c47f4" }, "downloads": -1, "filename": "libraptorq-16.2.4.tar.gz", "has_sig": false, "md5_digest": "591b654924f3cd115d9dd2a0e03325ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11121, "upload_time": "2016-02-24T23:26:48", "url": "https://files.pythonhosted.org/packages/6f/64/ade078d9445a25f8718060c0f15ab2764eea2755e8ac8315ea0d3fdbe219/libraptorq-16.2.4.tar.gz" } ], "16.7.3": [ { "comment_text": "", "digests": { "md5": "843bb531721767426c7735f81b392e86", "sha256": "109c180a3aff8dc4d7977371a65bc5198e29e5658d8cc58df762b9eaeb8f8fa5" }, "downloads": -1, "filename": "libraptorq-16.7.3.tar.gz", "has_sig": false, "md5_digest": "843bb531721767426c7735f81b392e86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11084, "upload_time": "2016-07-15T17:45:56", "url": "https://files.pythonhosted.org/packages/24/fe/30798eb746ac502dfdf1c72a955d51956652c94bb25244e85a36d7245f08/libraptorq-16.7.3.tar.gz" } ], "16.7.5": [ { "comment_text": "", "digests": { "md5": "1c99cb8b3aa3d7db1b838358df67a638", "sha256": "97fd9ea5ac92bc3552863ec51eeda802a20492fe52fe2aa2634b70fb5b35aef0" }, "downloads": -1, "filename": "libraptorq-16.7.5.tar.gz", "has_sig": false, "md5_digest": "1c99cb8b3aa3d7db1b838358df67a638", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11092, "upload_time": "2016-07-16T12:59:49", "url": "https://files.pythonhosted.org/packages/35/ec/2089b117c17d27f56ae4e887123414a196463a954a483f900f6164a9e9ef/libraptorq-16.7.5.tar.gz" } ], "16.8.1": [ { "comment_text": "", "digests": { "md5": "d22dd3c904daf60e390529bdb0f513d7", "sha256": "dbbf3855f5f3a1cfb7d79ab7b9668228fbc7ea374fce66d80e01db0c22e1e1cb" }, "downloads": -1, "filename": "libraptorq-16.8.1.tar.gz", "has_sig": false, "md5_digest": "d22dd3c904daf60e390529bdb0f513d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11477, "upload_time": "2016-08-30T17:50:53", "url": "https://files.pythonhosted.org/packages/77/ba/5e9125e47b472d7225cc75a273e58f8bbe3a58ba2ccfb056a7477770e8be/libraptorq-16.8.1.tar.gz" } ], "16.8.2": [ { "comment_text": "", "digests": { "md5": "2e24d6c275af9f1a9939f2ba35bc7284", "sha256": "e284b7f257cffee7f32403d689a841cead5e5a6d271eca8e50eebd1b93a6c08f" }, "downloads": -1, "filename": "libraptorq-16.8.2.tar.gz", "has_sig": false, "md5_digest": "2e24d6c275af9f1a9939f2ba35bc7284", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11471, "upload_time": "2016-08-30T18:06:26", "url": "https://files.pythonhosted.org/packages/42/16/3608db6a922563422fa7b6408254845e98274d1b6468f59a7a62a4838c7f/libraptorq-16.8.2.tar.gz" } ], "16.9.5": [ { "comment_text": "", "digests": { "md5": "8fef0d071f70ae0b961d631ec0168468", "sha256": "11083e1e1503e23f8b465d54c83905c71653d516da6e4f4558bc1317669b2bbb" }, "downloads": -1, "filename": "libraptorq-16.9.5.tar.gz", "has_sig": false, "md5_digest": "8fef0d071f70ae0b961d631ec0168468", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11995, "upload_time": "2016-09-06T07:20:39", "url": "https://files.pythonhosted.org/packages/66/fd/80c880141d49765652209a68fbd5d2a4fd8e612fdc7e83b0931478a19835/libraptorq-16.9.5.tar.gz" } ], "16.9.6": [ { "comment_text": "", "digests": { "md5": "9874cfb47803a3bfee24300aba78c1e5", "sha256": "72e4edc200dec2d7719d240fd94357e4cd50d7153c039868816bda45cdaef78e" }, "downloads": -1, "filename": "libraptorq-16.9.6.tar.gz", "has_sig": false, "md5_digest": "9874cfb47803a3bfee24300aba78c1e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12056, "upload_time": "2016-09-08T09:36:07", "url": "https://files.pythonhosted.org/packages/e4/d2/23f80995f1e76ac2d1ce6459cb40763c11a51a28fd35d4f7cd3e2bf8860e/libraptorq-16.9.6.tar.gz" } ], "17.5.0": [ { "comment_text": "", "digests": { "md5": "b3d03ccf7498952c21b91e0b150f47c7", "sha256": "6f79adc9ff92ca95cc3b83f689b83bcb77cc67dd8461d486a1dd6dbb8ba00051" }, "downloads": -1, "filename": "libraptorq-17.5.0-py2-none-any.whl", "has_sig": false, "md5_digest": "b3d03ccf7498952c21b91e0b150f47c7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17491, "upload_time": "2017-05-26T10:50:39", "url": "https://files.pythonhosted.org/packages/71/36/bc0ea646f8b5c6ce6210e396e8b334487ff846e7780218b31abcb51a1f9f/libraptorq-17.5.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a57bc1a940176bbc94d41ed32b7b7206", "sha256": "fc5ef10722732533f7e3359f8976194d3f1fd4d31a4dcf80443f3b0a3c81dfa8" }, "downloads": -1, "filename": "libraptorq-17.5.0.tar.gz", "has_sig": false, "md5_digest": "a57bc1a940176bbc94d41ed32b7b7206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12060, "upload_time": "2017-05-26T10:50:37", "url": "https://files.pythonhosted.org/packages/eb/bd/56ddeb0b1bc32a08c7ae41cd78571a41ae8174f5b0f0654e013946646071/libraptorq-17.5.0.tar.gz" } ], "17.5.1": [ { "comment_text": "", "digests": { "md5": "d731eda8222397f5e5eccf6675d72870", "sha256": "4b3c226413ad33c184e72978c6e2d45f24a675022d2ac1c0b4dbb9b7941ee2b7" }, "downloads": -1, "filename": "libraptorq-17.5.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d731eda8222397f5e5eccf6675d72870", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17493, "upload_time": "2017-05-26T11:03:18", "url": "https://files.pythonhosted.org/packages/43/d1/7e526586b5f3abdb6d879c4afb42ee70e3ff4d17d1ff695934adac4ba05c/libraptorq-17.5.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc36be2af803c8b2d79f1e953d01cbcd", "sha256": "3c7bd9b8dc44f37068ede12f5d943575f8b9f3c88f91096a8802985a7bd305b5" }, "downloads": -1, "filename": "libraptorq-17.5.1.tar.gz", "has_sig": false, "md5_digest": "fc36be2af803c8b2d79f1e953d01cbcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12059, "upload_time": "2017-05-26T11:03:16", "url": "https://files.pythonhosted.org/packages/8c/24/b73a8d4475684b2f516a8297c809e912200e25e902c3de6c390363916842/libraptorq-17.5.1.tar.gz" } ], "17.5.2": [ { "comment_text": "", "digests": { "md5": "3b5e186953db40efbaeaa269cb1c3073", "sha256": "d622b62cde4663579a7214516ef4e08416be684d3ee0a567989a6db412b1a007" }, "downloads": -1, "filename": "libraptorq-17.5.2-py2-none-any.whl", "has_sig": false, "md5_digest": "3b5e186953db40efbaeaa269cb1c3073", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17555, "upload_time": "2017-05-26T11:07:09", "url": "https://files.pythonhosted.org/packages/15/a9/c3d5630409a953b29717fe782ffc42c09f17a810f1e3cce28e85b075e994/libraptorq-17.5.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8920b351a7691be87599769492079b8d", "sha256": "244e896452a8d3b0a3635c31b41864644e0d13ef547a504209f2a87f04d781c6" }, "downloads": -1, "filename": "libraptorq-17.5.2.tar.gz", "has_sig": false, "md5_digest": "8920b351a7691be87599769492079b8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12117, "upload_time": "2017-05-26T11:07:07", "url": "https://files.pythonhosted.org/packages/bb/68/510d717965439223dc5151faab9ca4c447de9357260fdbd3f5e62c8b97a4/libraptorq-17.5.2.tar.gz" } ], "18.3.0": [ { "comment_text": "", "digests": { "md5": "0f4c888f2871216118af565b1dce3fc6", "sha256": "076f4b8a031b588d1fab6c3505ccb8c7cc77462a975b261af4c2d67b5140c214" }, "downloads": -1, "filename": "libraptorq-18.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "0f4c888f2871216118af565b1dce3fc6", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17674, "upload_time": "2018-03-06T06:51:25", "url": "https://files.pythonhosted.org/packages/7c/7a/012f6b7594f8dbf2def1bdeb4ad409fa65c606389a5798e38d8fa6a01e2c/libraptorq-18.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f0aca58513353fea2326559ad664e35a", "sha256": "8aa982fbede6983779cb74967b206f4ee4c6861fea045ca17719f5469cd86eaa" }, "downloads": -1, "filename": "libraptorq-18.3.0.tar.gz", "has_sig": false, "md5_digest": "f0aca58513353fea2326559ad664e35a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12194, "upload_time": "2018-03-06T06:51:23", "url": "https://files.pythonhosted.org/packages/f0/ac/a1895858f5024bd2016356ad0f92b05c4e2518573233c917fa3ee92eb0c2/libraptorq-18.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0f4c888f2871216118af565b1dce3fc6", "sha256": "076f4b8a031b588d1fab6c3505ccb8c7cc77462a975b261af4c2d67b5140c214" }, "downloads": -1, "filename": "libraptorq-18.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "0f4c888f2871216118af565b1dce3fc6", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17674, "upload_time": "2018-03-06T06:51:25", "url": "https://files.pythonhosted.org/packages/7c/7a/012f6b7594f8dbf2def1bdeb4ad409fa65c606389a5798e38d8fa6a01e2c/libraptorq-18.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f0aca58513353fea2326559ad664e35a", "sha256": "8aa982fbede6983779cb74967b206f4ee4c6861fea045ca17719f5469cd86eaa" }, "downloads": -1, "filename": "libraptorq-18.3.0.tar.gz", "has_sig": false, "md5_digest": "f0aca58513353fea2326559ad664e35a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12194, "upload_time": "2018-03-06T06:51:23", "url": "https://files.pythonhosted.org/packages/f0/ac/a1895858f5024bd2016356ad0f92b05c4e2518573233c917fa3ee92eb0c2/libraptorq-18.3.0.tar.gz" } ] }