{
"info": {
"author": "Yen, Tzu-Hsi",
"author_email": "joseph.yen@gmail.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Topic :: Software Development :: Libraries"
],
"description": "**orz**: Result type\n=============================\n\n**orz** aims to provide a more pythonic and mature Result type(or similar to Result type) for Python.\n\nResult is a Monad type for handling success response and errors without using `try ... except` or special values(e.g. `-1`, `0` or `None`). It makes your code more readable and more elegant.\n\nMany langauges already have a builtin Result type. e.g. `Result in Rust `_, `Either type in Haskell `_ , `Result type in Swift `_ and `Result type in OCaml `_. And there's a `proposal in Go `_. Although `Promise in Javascript `_ is not a Result type, it handles errors fluently in a similar way.\n\nExisting Result type Python libraries, such as `dbrgn/result `_, `arcrose/result_py `_, and `ipconfiger/result2 `_ did great job on porting Result from other languages. However, most of these libraries doesn't support Python 2(sadly, I still have to use it). And because of the syntax limitation of Python, like lack of pattern matching, it's not easy to show all the strength of Result type.\n\n**orz** trying to make Result more pythonic and readable, useful in most cases.\n\nInstall Orz\n=============\n\nJust like other Python package, install it by `pip\n`_ into a `virtualenv\n`_, or use `poetry\n`_ to automatically create and manage the\nvirtualenv.\n\n.. code-block:: console\n\n $ pip install orz\n\nGetting Start\n=============\n\nCreate a ``orz.Result`` object\n------------------------------\n\nWrap the return value with ``orz.Ok`` explicitly for indicating success. And\nreturn an ``orz.Err`` object when something went wrong. Normally, the value wraped with\n``Err`` is an error message or an exception object.\n\n.. code-block:: python\n\n >>> import orz\n\n >>> def get_score_rz(subj):\n ... score_db = {'math': 80, 'physics': 95}\n ... if subj in score_db:\n ... return orz.Ok(score_db[subj])\n ... else:\n ... return orz.Err('subj does not exist: ' + subj)\n\n >>> get_score_rz('math')\n Ok(80)\n >>> get_score_rz('bio')\n Err('subj does not exist: bio')\n\nA handy decorator ``orz.catch`` can transform normal function into a\nResult-oriented function. The return value would be wraped with ``orz.Ok``\nautomatically, and exceptions would be captured and wraped with ``orz.Err``.\n\n.. code-block:: python\n\n >>> @orz.catch(raises=KeyError)\n ... def get_score_rz(subj):\n ... score_db = {'math': 80, 'physics': 95}\n ... return score_db[subj]\n\n >>> get_score_rz('math')\n Ok(80)\n >>> get_score_rz('bio')\n Err(KeyError('bio',))\n\nProcessing Pipeline\n-------------------\n\nBoth ``Ok`` and ``Err`` are of ``Result`` type, they have the same set of methods for further processing. The value in ``Ok`` would be transformed with ``then(func)``. And ``Err`` would skip the transformation, and propogate the error to the next stage.\n\n.. code-block:: python\n\n >>> def get_letter_grade_rz(score):\n ... if 90 <= score <= 100: return orz.Ok('A')\n ... elif 80 <= score < 90: return orz.Ok('B')\n ... elif 70 <= score < 80: return orz.Ok('C')\n ... elif 60 <= score < 70: return orz.Ok('D')\n ... elif 0 <= score <= 60: return orz.Ok('F')\n ... else: return orz.Err('Wrong value range')\n\n >>> get_score_rz('math')\n Ok(80)\n >>> get_score_rz('math').then(get_letter_grade_rz)\n Ok('B')\n >>> get_score_rz('bio')\n Err(KeyError('bio',))\n >>> get_score_rz('bio').then(get_letter_grade_rz)\n Err(KeyError('bio',))\n\n\nThe ``func`` pass to the ``then(func, catch_raises=None)`` can be a normal\nfunction which returns an ordinary value. The returned value would be wraped with\n``Ok`` automatically. Use ``catch_raises`` to capture exceptions and returned as an ``Err`` object.\n\n.. code-block:: python\n\n >>> letter_grade_rz = get_score_rz('math').then(get_letter_grade_rz)\n >>> msg_rz = letter_grade_rz.then(lambda letter_grade: 'your grade is {}'.format(letter_grade))\n >>> msg_rz\n Ok('your grade is B')\n\nConnect all the ``then(func)`` calls together. And use\n``Result.get_or(default)`` to get the final\nvalue.\n\n.. code-block:: python\n\n >>> def get_grade_msg(subj):\n ... return (\n ... get_score_rz(subj)\n ... .then(get_letter_grade_rz)\n ... .then(lambda letter_grade: 'your grade is {}'.format(letter_grade))\n ... .get_or('something went wrong'))\n\n >>> get_grade_msg('math')\n 'your grade is B'\n >>> get_grade_msg('bio')\n 'something went wrong'\n\nIf you prefer to raise an exception rather than get a fallback value, use ``get_or_raise(error)`` instead.\n\n.. code-block:: python\n\n >>> def get_grade_msg(subj):\n ... return (\n ... get_score_rz(subj)\n ... .then(get_letter_grade_rz)\n ... .then(lambda letter_grade: 'your grade is {}'.format(letter_grade))\n ... .get_or_raise())\n\n >>> get_grade_msg('math')\n 'your grade is B'\n >>> get_grade_msg('bio')\n Traceback (most recent call last):\n ...\n KeyError: 'bio'\n\n\nHandling Error\n--------------\n\nUse ``Result.err_then(func, catch_raises)`` to convert ``Err`` back to ``Ok`` or to other ``Err``.\n\n.. code-block:: python\n\n >>> get_score_rz('bio')\n Err(KeyError('bio',))\n >>> get_score_rz('bio').then(get_letter_grade_rz)\n Err(KeyError('bio',))\n >>> (get_score_rz('bio')\n ... .err_then(lambda error: 0 if isinstance(error, KeyError) else error))\n Ok(0)\n >>> (get_score_rz('bio')\n ... .err_then(lambda error: 0 if isinstance(error, KeyError) else error)\n ... .then(get_letter_grade_rz))\n Ok('F')\n >>> (get_score_rz('bio')\n ... .then(get_letter_grade_rz)\n ... .err_then(lambda error: 'F' if isinstance(error, KeyError) else error))\n Ok('F')\n\n\nMost of the time, ``fill()`` is more concise to turn some ``Err`` back.\n\n.. code-block:: python\n\n >>> get_score_rz('bio').fill(lambda error: isinstance(error, KeyError), 0)\n Ok(0)\n\n\nMore in Orz\n===========\n\nProcess Multiple Result objects\n-------------------------------\n\nTo ensure all values are ``Ok`` and handle them together.\n\n.. code-block:: python\n\n >>> orz.all([orz.Ok(39), orz.Ok(2), orz.Ok(1)])\n Ok([39, 2, 1])\n >>> orz.all([orz.Ok(40), orz.Err('wrong value'), orz.Ok(1)])\n Err('wrong value')\n\n >>> orz.all([orz.Ok(40), orz.Ok(2)]).then(lambda values: sum(values))\n Ok(42)\n >>> orz.all([orz.Ok(40), orz.Ok(2)]).then_unpack(lambda n1, n2: n1 + n2)\n Ok(42)\n\n\n``then_all()`` is useful when you want to apply multiple functions to the same value.\n\n.. code-block:: python\n\n >>> orz.Ok(3).then_all(lambda n: n+2, lambda n: n+1)\n Ok([5, 4])\n >>> orz.Ok(3).then_all(lambda n: n+2, lambda n: n+1).then_unpack(lambda n1, n2: n1 + n2)\n Ok(9)\n\nUse ``first_ok()`` To get the first available value.\n\n.. code-block:: python\n\n >>> orz.first_ok([orz.Err('E1'), orz.Ok(42), orz.Ok(3)])\n Ok(42)\n >>> orz.first_ok([orz.Err('E1'), orz.Err('E2'), orz.Err('E3')])\n Err('E3')\n >>> orz.Ok(15).then_first_ok(\n ... lambda v: 2 if (v % 2) == 0 else orz.Err('not a factor'),\n ... lambda v: 3 if (v % 3) == 0 else orz.Err('not a factor'),\n ... lambda v: 5 if (v % 5) == 0 else orz.Err('not a factor'))\n Ok(3)\n\nGuard value\n-----------\n\n.. code-block:: python\n\n >>> orz.Ok(3).guard(lambda v: v > 0)\n Ok(3)\n >>> orz.Ok(-3).guard(lambda v: v > 0)\n Err(CheckError('Ok(-3) was failed to pass the guard: at ...>',))\n >>> orz.Ok(-3).guard(lambda v: v > 0, err=orz.Err('value should be greater than zero'))\n Err('value should be greater than zero')\n\nIn fact, guard is a short-hand for a pattern of ``then()``.\n\n.. code-block:: python\n\n >>> (orz.Ok(-3)\n ... .then(lambda v:\n ... orz.Ok(v) if v > 0\n ... else orz.Err('value should be greater than zero')))\n Err('value should be greater than zero')\n\n >>> orz.Ok(3).guard_none()\n Ok(3)\n >>> orz.Ok(None).guard_none()\n Err(CheckError('failed to pass not None guard: ...',))\n\nConvert any value to Result type\n--------------------------------\n\n``orz.ensure`` always returns a Result object.\n\n.. code-block:: python\n\n >>> orz.ensure(42)\n Ok(42)\n >>> orz.ensure(orz.Ok(42))\n Ok(42)\n >>> orz.ensure(orz.Ok(orz.Ok(42)))\n Ok(42)\n >>> orz.ensure(orz.Err('failed'))\n Err('failed')\n >>> orz.ensure(KeyError('a'))\n Err(KeyError('a',))\n\n\nCheck if object is a Result\n----------------------------\n\n.. code-block:: python\n\n >>> orz.is_result(orz.Ok(3))\n True\n >>> isinstance(orz.Ok(3), orz.Result)\n True\n >>> orz.Ok(3).is_ok()\n True\n >>> orz.Ok(3).is_err()\n False\n >>> orz.Err('E').is_ok()\n False\n >>> orz.Err('E').is_err()\n True\n",
"description_content_type": "text/x-rst",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/d2207197/orz",
"keywords": "result,monad,error,exception,either,functional,error handling",
"license": "Apache-2.0",
"maintainer": "Yen, Tzu-Hsi",
"maintainer_email": "joseph.yen@gmail.com",
"name": "orz",
"package_url": "https://pypi.org/project/orz/",
"platform": "",
"project_url": "https://pypi.org/project/orz/",
"project_urls": {
"Homepage": "https://github.com/d2207197/orz",
"Repository": "https://github.com/d2207197/orz"
},
"release_url": "https://pypi.org/project/orz/0.3.1/",
"requires_dist": null,
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"summary": "A Result(Either) like library to handle error fluently",
"version": "0.3.1"
},
"last_serial": 5787501,
"releases": {
"0.1.0": [
{
"comment_text": "",
"digests": {
"md5": "71f8a4721a607d743cf935ab45d95806",
"sha256": "8594ad8d7368dcd0d7551bea487c7fdaa3cc2220dfe3c35829d0bc99dcf81485"
},
"downloads": -1,
"filename": "orz-0.1.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "71f8a4721a607d743cf935ab45d95806",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7674,
"upload_time": "2019-06-22T16:50:43",
"url": "https://files.pythonhosted.org/packages/b8/a6/dad2589b2811a7c3eacba689b83db1bba38ef2000c03d5f5d2a70744ec68/orz-0.1.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "afe66f062e81f5131683a1cdd85d242a",
"sha256": "7ccac2a9c9c66298beaaa5f36c975dd9c8451e3400097c427e850262ec45fe38"
},
"downloads": -1,
"filename": "orz-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "afe66f062e81f5131683a1cdd85d242a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7190,
"upload_time": "2019-06-22T16:50:46",
"url": "https://files.pythonhosted.org/packages/82/00/f2ddf15a84635ac5224866e0fd539136676457b943b92b08395c4a5ff151/orz-0.1.0.tar.gz"
}
],
"0.1.1": [
{
"comment_text": "",
"digests": {
"md5": "7b1c0b35e8daaeb3acab495f7c60877d",
"sha256": "2dc5efc421eef58d78373cb56022ba86aea1c1268320cd0a5f0e73b79dc64265"
},
"downloads": -1,
"filename": "orz-0.1.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "7b1c0b35e8daaeb3acab495f7c60877d",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7694,
"upload_time": "2019-06-26T12:59:22",
"url": "https://files.pythonhosted.org/packages/e4/46/088bf33f998690c33afb03656c72abc9c93ebcb901a3c42b65f5eccb8627/orz-0.1.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "75240a81429b510010c13478908d0657",
"sha256": "eee4b708d602db4e81ed9716bb6c977e4ceaeb15f7adac803a460dc033d05eba"
},
"downloads": -1,
"filename": "orz-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "75240a81429b510010c13478908d0657",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7221,
"upload_time": "2019-06-26T12:59:23",
"url": "https://files.pythonhosted.org/packages/9b/72/3ad2d7fb713cccc9710e574647d0ff259adee1fbb7051aee6dd56a8860b2/orz-0.1.1.tar.gz"
}
],
"0.2.0": [
{
"comment_text": "",
"digests": {
"md5": "0188b3ead7714946747e0f9a9c275f3d",
"sha256": "a05bd8a8b5976000dbea859dfde5e01ca0de3abf868566f8f092f7abc5aca52d"
},
"downloads": -1,
"filename": "orz-0.2.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "0188b3ead7714946747e0f9a9c275f3d",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7771,
"upload_time": "2019-09-02T17:58:33",
"url": "https://files.pythonhosted.org/packages/9a/af/54b8cb876936446ed3e7020a96ecc1261c9dac191c7b0d4ef6c4b796264a/orz-0.2.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "46bf6a72bb873cba7cdf54fe358a05ab",
"sha256": "75719f48ac868c9d974c85dbe72ff560f083eb7362b1769b4b480dca4977c913"
},
"downloads": -1,
"filename": "orz-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "46bf6a72bb873cba7cdf54fe358a05ab",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7328,
"upload_time": "2019-09-02T17:58:34",
"url": "https://files.pythonhosted.org/packages/d1/34/068c6154600f80dddb372e4d6f5fec1c1ec809cdbe66762d76987876a373/orz-0.2.0.tar.gz"
}
],
"0.2.1": [
{
"comment_text": "",
"digests": {
"md5": "df4a5e2c23ced138ed5a2a9f72c1af92",
"sha256": "77d4b7adc0c93c677b16757777037fffff64b929e312a01abf762443fa5439e3"
},
"downloads": -1,
"filename": "orz-0.2.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "df4a5e2c23ced138ed5a2a9f72c1af92",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7771,
"upload_time": "2019-09-02T18:09:40",
"url": "https://files.pythonhosted.org/packages/86/cd/4267f0310a4caa85336ddbd3154e0c8f6e6a735747c33bd828941075dd42/orz-0.2.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "0fd8c4990371b14ad650c93b1cbbd5f3",
"sha256": "7d7eea64f9e5752e38f671f4fa455fac28645f6eb842418b768852e64c50578f"
},
"downloads": -1,
"filename": "orz-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "0fd8c4990371b14ad650c93b1cbbd5f3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7331,
"upload_time": "2019-09-02T18:09:41",
"url": "https://files.pythonhosted.org/packages/03/8a/dc5e8e1d8723fe37382eca693058c16c81d84e3258263ca8bab0452cae5c/orz-0.2.1.tar.gz"
}
],
"0.2.2": [
{
"comment_text": "",
"digests": {
"md5": "d4fbc63b2e985d2f80bd63431109e475",
"sha256": "034cd47ef64a5edadfca3208c096b5b033845205198641d2a4c6cec8b92a9179"
},
"downloads": -1,
"filename": "orz-0.2.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "d4fbc63b2e985d2f80bd63431109e475",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7778,
"upload_time": "2019-09-03T17:32:31",
"url": "https://files.pythonhosted.org/packages/26/39/feee7779eeb3c3fdc9b57849971db6cd804f182844424945f15f72dc1e2a/orz-0.2.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "346098b39a90d24ddbc182c11d856861",
"sha256": "8e226540aefd376e7df6ddd1445390f3ea5db587e0d2336b8eaa3709555973d3"
},
"downloads": -1,
"filename": "orz-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "346098b39a90d24ddbc182c11d856861",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7315,
"upload_time": "2019-09-03T17:32:33",
"url": "https://files.pythonhosted.org/packages/dd/d3/bfd74547f4e55fd18951d64ca9fac53db1003d4784b25a8d7d998fabd46f/orz-0.2.2.tar.gz"
}
],
"0.3.0": [
{
"comment_text": "",
"digests": {
"md5": "e1cb6ac84379596cf2a08934a75d2742",
"sha256": "bc30445311f95e0e0315f9cc2e9b14ae6fafd1a4172b42957efdc85724e72ce8"
},
"downloads": -1,
"filename": "orz-0.3.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "e1cb6ac84379596cf2a08934a75d2742",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7866,
"upload_time": "2019-09-05T16:48:53",
"url": "https://files.pythonhosted.org/packages/bc/f2/8ce4b5e2aa9db9e1595ec4005424dae7f2a8ffe429acd9901329e3ea8a9b/orz-0.3.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "51370f15d761bf73460756893c96a5a1",
"sha256": "d9102c80a40159c7614083b5081211b3748b22009059646ff1cebb6e33caba34"
},
"downloads": -1,
"filename": "orz-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "51370f15d761bf73460756893c96a5a1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 7406,
"upload_time": "2019-09-05T16:48:55",
"url": "https://files.pythonhosted.org/packages/7a/84/3ad2fb9e417da85fa52f1593acc5c8ee1d3a270d009028ada794b35ad4d7/orz-0.3.0.tar.gz"
}
],
"0.3.1": [
{
"comment_text": "",
"digests": {
"md5": "2ec1d8ac5ce98fd770c84972c6898bcc",
"sha256": "a0e6a4c04c2e2d84e870b77941c42d59e11d83ff640d4340cf56d8afc3048c37"
},
"downloads": -1,
"filename": "orz-0.3.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "2ec1d8ac5ce98fd770c84972c6898bcc",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 10614,
"upload_time": "2019-09-05T17:02:25",
"url": "https://files.pythonhosted.org/packages/37/28/b26f0ef111b20d7f7c011fce24f80d5430d703f9b2c2a7a77b1a9ad91bbe/orz-0.3.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "964b2712602921b462739efdb1459c76",
"sha256": "df4fc73f5c50204a6520a6c05700131421461ed2d7dd50893e8cd816367f4dc2"
},
"downloads": -1,
"filename": "orz-0.3.1.tar.gz",
"has_sig": false,
"md5_digest": "964b2712602921b462739efdb1459c76",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 11476,
"upload_time": "2019-09-05T17:02:28",
"url": "https://files.pythonhosted.org/packages/91/1e/13771ec1a2a18d924676811b13bd6f1d8060f78867d248adc77e8a3c8b36/orz-0.3.1.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "2ec1d8ac5ce98fd770c84972c6898bcc",
"sha256": "a0e6a4c04c2e2d84e870b77941c42d59e11d83ff640d4340cf56d8afc3048c37"
},
"downloads": -1,
"filename": "orz-0.3.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "2ec1d8ac5ce98fd770c84972c6898bcc",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 10614,
"upload_time": "2019-09-05T17:02:25",
"url": "https://files.pythonhosted.org/packages/37/28/b26f0ef111b20d7f7c011fce24f80d5430d703f9b2c2a7a77b1a9ad91bbe/orz-0.3.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "964b2712602921b462739efdb1459c76",
"sha256": "df4fc73f5c50204a6520a6c05700131421461ed2d7dd50893e8cd816367f4dc2"
},
"downloads": -1,
"filename": "orz-0.3.1.tar.gz",
"has_sig": false,
"md5_digest": "964b2712602921b462739efdb1459c76",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
"size": 11476,
"upload_time": "2019-09-05T17:02:28",
"url": "https://files.pythonhosted.org/packages/91/1e/13771ec1a2a18d924676811b13bd6f1d8060f78867d248adc77e8a3c8b36/orz-0.3.1.tar.gz"
}
]
}