{ "info": { "author": "Timo Furrer", "author_email": "tuxtimo@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Code Generators", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. image:: https://img.shields.io/travis/jenisys/parse_type/master.svg\n :target: https://travis-ci.org/jenisys/parse_type\n :alt: Travis CI Build Status\n\n.. image:: https://img.shields.io/pypi/v/parse_type.svg\n :target: https://pypi.python.org/pypi/parse_type\n :alt: Latest Version\n\n.. image:: https://img.shields.io/pypi/dm/parse_type.svg\n :target: https://pypi.python.org/pypi/parse_type\n :alt: Downloads\n\n.. image:: https://img.shields.io/pypi/l/parse_type.svg\n :target: https://pypi.python.org/pypi/parse_type/\n :alt: License\n\n\n`parse_type`_ extends the `parse`_ module (opposite of `string.format()`_)\nwith the following features:\n\n * build type converters for common use cases (enum/mapping, choice)\n * build a type converter with a cardinality constraint (0..1, 0..*, 1..*)\n from the type converter with cardinality=1.\n * compose a type converter from other type converters\n * an extended parser that supports the CardinalityField naming schema\n and creates missing type variants (0..1, 0..*, 1..*) from the\n primary type converter\n\n.. _parse_type: http://pypi.python.org/pypi/parse_type\n.. _parse: http://pypi.python.org/pypi/parse\n.. _`string.format()`: http://docs.python.org/library/string.html#format-string-syntax\n\n\nDefinitions\n-------------------------------------------------------------------------------\n\n*type converter*\n A type converter function that converts a textual representation\n of a value type into instance of this value type.\n In addition, a type converter function is often annotated with attributes\n that allows the `parse`_ module to use it in a generic way.\n A type converter is also called a *parse_type* (a definition used here).\n\n*cardinality field*\n A naming convention for related types that differ in cardinality.\n A cardinality field is a type name suffix in the format of a field.\n It allows parse format expression, ala::\n\n \"{person:Person}\" #< Cardinality: 1 (one; the normal case)\n \"{person:Person?}\" #< Cardinality: 0..1 (zero or one = optional)\n \"{persons:Person*}\" #< Cardinality: 0..* (zero or more = many0)\n \"{persons:Person+}\" #< Cardinality: 1..* (one or more = many)\n\n This naming convention mimics the relationship descriptions in UML diagrams.\n\n\nBasic Example\n-------------------------------------------------------------------------------\n\nDefine an own type converter for numbers (integers):\n\n.. code-block:: python\n\n # -- USE CASE:\n def parse_number(text):\n return int(text)\n parse_number.pattern = r\"\\d+\" # -- REGULAR EXPRESSION pattern for type.\n\nThis is equivalent to:\n\n.. code-block:: python\n\n import parse\n\n @parse.with_pattern(r\"\\d+\")\n def parse_number(text):\n return int(text)\n assert hasattr(parse_number, \"pattern\")\n assert parse_number.pattern == r\"\\d+\"\n\n\n.. code-block:: python\n\n # -- USE CASE: Use the type converter with the parse module.\n schema = \"Hello {number:Number}\"\n parser = parse.Parser(schema, dict(Number=parse_number))\n result = parser.parse(\"Hello 42\")\n assert result is not None, \"REQUIRE: text matches the schema.\"\n assert result[\"number\"] == 42\n\n result = parser.parse(\"Hello XXX\")\n assert result is None, \"MISMATCH: text does not match the schema.\"\n\n.. hint::\n\n The described functionality above is standard functionality\n of the `parse`_ module. It serves as introduction for the remaining cases.\n\n\nCardinality\n-------------------------------------------------------------------------------\n\nCreate an type converter for \"ManyNumbers\" (List, separated with commas)\nwith cardinality \"1..* = 1+\" (many) from the type converter for a \"Number\".\n\n.. code-block:: python\n\n # -- USE CASE: Create new type converter with a cardinality constraint.\n # CARDINALITY: many := one or more (1..*)\n from parse import Parser\n from parse_type import TypeBuilder\n parse_numbers = TypeBuilder.with_many(parse_number, listsep=\",\")\n\n schema = \"List: {numbers:ManyNumbers}\"\n parser = Parser(schema, dict(ManyNumbers=parse_numbers))\n result = parser.parse(\"List: 1, 2, 3\")\n assert result[\"numbers\"] == [1, 2, 3]\n\n\nCreate an type converter for an \"OptionalNumbers\" with cardinality \"0..1 = ?\"\n(optional) from the type converter for a \"Number\".\n\n.. code-block:: python\n\n # -- USE CASE: Create new type converter with cardinality constraint.\n # CARDINALITY: optional := zero or one (0..1)\n from parse import Parser\n from parse_type import TypeBuilder\n\n parse_optional_number = TypeBuilder.with_optional(parse_number)\n schema = \"Optional: {number:OptionalNumber}\"\n parser = Parser(schema, dict(OptionalNumber=parse_optional_number))\n result = parser.parse(\"Optional: 42\")\n assert result[\"number\"] == 42\n result = parser.parse(\"Optional: \")\n assert result[\"number\"] == None\n\n\nEnumeration (Name-to-Value Mapping)\n-------------------------------------------------------------------------------\n\nCreate an type converter for an \"Enumeration\" from the description of\nthe mapping as dictionary.\n\n.. code-block:: python\n\n # -- USE CASE: Create a type converter for an enumeration.\n from parse import Parser\n from parse_type import TypeBuilder\n\n parse_enum_yesno = TypeBuilder.make_enum({\"yes\": True, \"no\": False})\n parser = Parser(\"Answer: {answer:YesNo}\", dict(YesNo=parse_enum_yesno))\n result = parser.parse(\"Answer: yes\")\n assert result[\"answer\"] == True\n\n\nCreate an type converter for an \"Enumeration\" from the description of\nthe mapping as an enumeration class (`Python 3.4 enum`_ or the `enum34`_\nbackport; see also: `PEP-0435`_).\n\n.. code-block:: python\n\n # -- USE CASE: Create a type converter for enum34 enumeration class.\n # NOTE: Use Python 3.4 or enum34 backport.\n from parse import Parser\n from parse_type import TypeBuilder\n from enum import Enum\n\n class Color(Enum):\n red = 1\n green = 2\n blue = 3\n\n parse_enum_color = TypeBuilder.make_enum(Color)\n parser = Parser(\"Select: {color:Color}\", dict(Color=parse_enum_color))\n result = parser.parse(\"Select: red\")\n assert result[\"color\"] is Color.red\n\n.. _`Python 3.4 enum`: http://docs.python.org/3.4/library/enum.html#module-enum\n.. _enum34: http://pypi.python.org/pypi/enum34\n.. _PEP-0435: http://www.python.org/dev/peps/pep-0435\n\n\nChoice (Name Enumeration)\n-------------------------------------------------------------------------------\n\nA Choice data type allows to select one of several strings.\n\nCreate an type converter for an \"Choice\" list, a list of unique names\n(as string).\n\n.. code-block:: python\n\n from parse import Parser\n from parse_type import TypeBuilder\n\n parse_choice_yesno = TypeBuilder.make_choice([\"yes\", \"no\"])\n schema = \"Answer: {answer:ChoiceYesNo}\"\n parser = Parser(schema, dict(ChoiceYesNo=parse_choice_yesno))\n result = parser.parse(\"Answer: yes\")\n assert result[\"answer\"] == \"yes\"\n\n\nVariant (Type Alternatives)\n-------------------------------------------------------------------------------\n\nSometimes you need a type converter that can accept text for multiple\ntype converter alternatives. This is normally called a \"variant\" (or: union).\n\nCreate an type converter for an \"Variant\" type that accepts:\n\n * Numbers (positive numbers, as integer)\n * Color enum values (by name)\n\n.. code-block:: python\n\n from parse import Parser, with_pattern\n from parse_type import TypeBuilder\n from enum import Enum\n\n class Color(Enum):\n red = 1\n green = 2\n blue = 3\n\n @with_pattern(r\"\\d+\")\n def parse_number(text):\n return int(text)\n\n # -- MAKE VARIANT: Alternatives of different type converters.\n parse_color = TypeBuilder.make_enum(Color)\n parse_variant = TypeBuilder.make_variant([parse_number, parse_color])\n schema = \"Variant: {variant:Number_or_Color}\"\n parser = Parser(schema, dict(Number_or_Color=parse_variant))\n\n # -- TEST VARIANT: With number, color and mismatch.\n result = parser.parse(\"Variant: 42\")\n assert result[\"variant\"] == 42\n result = parser.parse(\"Variant: blue\")\n assert result[\"variant\"] is Color.blue\n result = parser.parse(\"Variant: __MISMATCH__\")\n assert not result\n\n\n\nExtended Parser with CardinalityField support\n-------------------------------------------------------------------------------\n\nThe parser extends the ``parse.Parser`` and adds the following functionality:\n\n * supports the CardinalityField naming scheme\n * automatically creates missing type variants for types with\n a CardinalityField by using the primary type converter for cardinality=1\n * extends the provide type converter dictionary with new type variants.\n\nExample:\n\n.. code-block:: python\n\n # -- USE CASE: Parser with CardinalityField support.\n # NOTE: Automatically adds missing type variants with CardinalityField part.\n # USE: parse_number() type converter from above.\n from parse_type.cfparse import Parser\n\n # -- PREPARE: parser, adds missing type variant for cardinality 1..* (many)\n type_dict = dict(Number=parse_number)\n schema = \"List: {numbers:Number+}\"\n parser = Parser(schema, type_dict)\n assert \"Number+\" in type_dict, \"Created missing type variant based on: Number\"\n\n # -- USE: parser.\n result = parser.parse(\"List: 1, 2, 3\")\n assert result[\"numbers\"] == [1, 2, 3]\n", "description_content_type": null, "docs_url": null, "download_url": "http://pypi.python.org/pypi/parse_type", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jenisys/parse_type", "keywords": "parse", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "radish-parse_type", "package_url": "https://pypi.org/project/radish-parse_type/", "platform": "any", "project_url": "https://pypi.org/project/radish-parse_type/", "project_urls": { "Download": "http://pypi.python.org/pypi/parse_type", "Homepage": "https://github.com/jenisys/parse_type" }, "release_url": "https://pypi.org/project/radish-parse_type/0.3.5/", "requires_dist": null, "requires_python": "", "summary": "Simplifies to build parse types based on the parse module", "version": "0.3.5" }, "last_serial": 2904623, "releases": { "0.3.5": [ { "comment_text": "", "digests": { "md5": "eaccbd2becc67313e80c9761e66b0045", "sha256": "85c2bf02868670d8dc4ac28f97c4f9a26c0939f30c2aff7d194423fc3fdb66c3" }, "downloads": -1, "filename": "radish_parse_type-0.3.5-py2-none-any.whl", "has_sig": false, "md5_digest": "eaccbd2becc67313e80c9761e66b0045", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 240030, "upload_time": "2017-05-28T13:42:45", "url": "https://files.pythonhosted.org/packages/80/21/830503fc51e204b12af7f062bc8510ab1c32dd5ed237d1a2ade99e068c19/radish_parse_type-0.3.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68cbae950748f4f08c1824ca670a7591", "sha256": "1029556ce9a0c76612183775b71a058403c9acc322ac1099ee5497f29ccc6fa5" }, "downloads": -1, "filename": "radish-parse_type-0.3.5.tar.gz", "has_sig": false, "md5_digest": "68cbae950748f4f08c1824ca670a7591", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 262964, "upload_time": "2017-05-28T13:42:41", "url": "https://files.pythonhosted.org/packages/c3/a3/177e8715c995e011b7e6ff966b1408e8b5392d0ebb35ec16494c5a291f32/radish-parse_type-0.3.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "eaccbd2becc67313e80c9761e66b0045", "sha256": "85c2bf02868670d8dc4ac28f97c4f9a26c0939f30c2aff7d194423fc3fdb66c3" }, "downloads": -1, "filename": "radish_parse_type-0.3.5-py2-none-any.whl", "has_sig": false, "md5_digest": "eaccbd2becc67313e80c9761e66b0045", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 240030, "upload_time": "2017-05-28T13:42:45", "url": "https://files.pythonhosted.org/packages/80/21/830503fc51e204b12af7f062bc8510ab1c32dd5ed237d1a2ade99e068c19/radish_parse_type-0.3.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68cbae950748f4f08c1824ca670a7591", "sha256": "1029556ce9a0c76612183775b71a058403c9acc322ac1099ee5497f29ccc6fa5" }, "downloads": -1, "filename": "radish-parse_type-0.3.5.tar.gz", "has_sig": false, "md5_digest": "68cbae950748f4f08c1824ca670a7591", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 262964, "upload_time": "2017-05-28T13:42:41", "url": "https://files.pythonhosted.org/packages/c3/a3/177e8715c995e011b7e6ff966b1408e8b5392d0ebb35ec16494c5a291f32/radish-parse_type-0.3.5.tar.gz" } ] }