{ "info": { "author": "Shonte Amato-Grill", "author_email": "shonte.amatogrill@gmail.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "canonical\\_args\n===============\n\n.. image:: https://travis-ci.org/shonteag/canonical_args.svg?branch=master\n :target: https://travis-ci.org/shonteag/canonical_args\n\ncanonical_args is a package designed to provide some certainty around abstract method calls. Consider, for instance, that we need to call one of many possible methods for a package we do not control. Each of these methods has the same arguments, but the potential values change depending on the function. We can write ``canonical_args`` arg specs for each of these methods, allowing us some clarity as to what each argument needs to be (types, values, etc.) when we execute dynamically: ::\n\n\t{\n\t\t\"args\": [\n\t\t\t{\n\t\t\t\t\"name\": \"argument1\",\n\t\t\t\t\"type\": int,\n\t\t\t\t\"values\": \"range(0, 15)\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"argument2\",\n\t\t\t\t\"type\": \"one([int, float, str])\",\n\t\t\t\t\"values\": {\n\t\t\t\t\t\"int\": \">0\",\n\t\t\t\t\t\"float\": \">0\",\n\t\t\t\t\t\"str\": [\"A\", \"B\", \"C\"]\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t\"kwargs\": {\n\t\t\t\"loss_function\": {\n\t\t\t\t\"type\": str,\n\t\t\t\t\"values\": [\"quadratic\", \"0-1\"]\n\t\t\t}\n\t\t}\n\t}\n\nWe can associate this spec with a method, either by registering it (if we do not control the method source): ::\n\n\tfrom canonical_args import register_spec\n\n\t# associates the spec to the method\n\tregister_spec(somemethod, spec)\n\n\t# method instance method returns the registered spec\n\tprint somemethod.get_spec()\n\nor by decorating a method, if we do control it (let's say for a dynamically imported method handler sub-method). ::\n\n\tfrom canonical_args import argspec\n\n\t@arg_spec(spec, register=True)\n\tdef ourmethod(argument1, argument2, loss_function=\"quadratic\"):\n\t\tpass\n\n\tprint ourmethod.get_spec()\n\nThis could potentially be of great use to dynamically generate frontend code with type and value-checking code. The specs themselves could be stored in a file or database, allowing for fully dynamic method calls: ::\n\n\tfrom canonical_args import check_args\n\timport pymongo\n\n\tconn = pymongo.MongoClient(\"localhost\", 27017)\n\n\tdef handle(message_type, *args, **kwargs):\n\t\tspec = conn.somedatabase.arg_specs.find_one(\n\t\t\t{\"message_type\": message_type})\n\t\tsubhandler = conn.somedatabase.handlers.find_one(\n\t\t\t{\"message_type\": message_type})\n\n\t\t# use canonical_args to check the unknown arguments\n\t\t# against the retrieved spec. will raise AssertionError\n\t\t# if fails.\n\t\tcheck_args(spec, *args, **kwargs)\n\n\t\t# if no errors raised, fire the retrieved handler method\n\t\treturn subhandler(*args, **kwargs)\n\n\tdef get_handler_spec(message_type):\n\t\t\"\"\"\n\t\tget the arg spec without executing the function. can\n\t\tbe used at front end (eg. HTML) for generating an\n\t\tappropriate form for method calls.\n\t\t\"\"\"\n\t\treturn conn.somedatabase.handlers.find_one(\n\t\t\t{\"message_type\": message_type})\n\nThe code above **does not** register the spec directly to the ``subhandler`` method, as it may not always be desirable to do so. The choice is yours.\n\nFull Documentation\n------------------\nhttps://shonteag.github.io/canonical_args/\n\nFuture Work\n-----------\nI aim to provide frontend code generation directly within the module, probably in a subpackage. At least to handle HTML ``
`` generation, possibly with Javascript type matching. **Currently under development!** (https://github.com/shonteag/canonical_args_frontend/)\n\n\nInstallation\n------------\nSimple as: ::\n\n\tpip install canonical_args\n\nTo run tests: ::\n\n\tgit clone https://github.com/shonteag/canonical_args\n\tnosetests\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/shonteag/canonical_args", "keywords": "", "license": "", "maintainer": "Shonte Amato-Grill", "maintainer_email": "shonte.amatogrill@gmail.com", "name": "canonical-args", "package_url": "https://pypi.org/project/canonical-args/", "platform": "", "project_url": "https://pypi.org/project/canonical-args/", "project_urls": { "Homepage": "https://github.com/shonteag/canonical_args" }, "release_url": "https://pypi.org/project/canonical-args/0.4.1/", "requires_dist": null, "requires_python": "", "summary": "A module for dynamically registering, checking, and working with nested argument specs.", "version": "0.4.1" }, "last_serial": 3874559, "releases": { "0.1.post3": [ { "comment_text": "", "digests": { "md5": "f22dbbf2be7233b0c3f6837a16a54e1a", "sha256": "bd7af84391d87ce86e19f127b74c5022a6b3017317baa511fbcac5816bfedb6f" }, "downloads": -1, "filename": "canonical_args-0.1.post3-py2-none-any.whl", "has_sig": false, "md5_digest": "f22dbbf2be7233b0c3f6837a16a54e1a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9048, "upload_time": "2018-04-13T20:15:00", "url": "https://files.pythonhosted.org/packages/39/a1/d611f1a02461813de74ad967859fdda15a5efc3d960440d84e0b2a0ea8fd/canonical_args-0.1.post3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c9c2b6de90b702d8448ce9a9229da25", "sha256": "60c946c199f87ecaa8313e95967641914d79b0c5f90bf651a6a8ed0276e2812f" }, "downloads": -1, "filename": "canonical_args-0.1.post3.tar.gz", "has_sig": false, "md5_digest": "3c9c2b6de90b702d8448ce9a9229da25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7413, "upload_time": "2018-04-13T20:15:11", "url": "https://files.pythonhosted.org/packages/f6/39/f5bdc66db4793fb3e16663ec2154d3be25a83e0d5cc89a34413300ece4d3/canonical_args-0.1.post3.tar.gz" } ], "0.1r1": [ { "comment_text": "", "digests": { "md5": "b52b6dfe40711d506370a0bd3bb6db83", "sha256": "1a74691800e496ce81300e5f7cdb241119dd005ebe9686f5bf132337e47e6d70" }, "downloads": -1, "filename": "canonical_args-0.1r1-py2-none-any.whl", "has_sig": false, "md5_digest": "b52b6dfe40711d506370a0bd3bb6db83", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 6618, "upload_time": "2018-04-13T14:39:14", "url": "https://files.pythonhosted.org/packages/43/40/5cf49372b9289c04e9b8da316971f74f45c168f9edfdd420e71c33323159/canonical_args-0.1r1-py2-none-any.whl" } ], "0.1r2": [ { "comment_text": "", "digests": { "md5": "5cfc402d77b3b83b6c867f538607cf27", "sha256": "e32de5b7a01d746008922441895854e85fd6e6b37d34118e567e1767414e9401" }, "downloads": -1, "filename": "canonical_args-0.1r2-py2-none-any.whl", "has_sig": false, "md5_digest": "5cfc402d77b3b83b6c867f538607cf27", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 6683, "upload_time": "2018-04-13T19:49:12", "url": "https://files.pythonhosted.org/packages/ff/ed/9aaec4896185428d22121fcf46ee0abc6e2d9895f5abcf5d0695d8e97c81/canonical_args-0.1r2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e9268aaa5b376d836d2ffd84aab075a", "sha256": "86f9f647df5af4dccd05a81a8caa7473bd032b3c8bd70cfec2319f7a642eba1f" }, "downloads": -1, "filename": "canonical_args-0.1r2.tar.gz", "has_sig": false, "md5_digest": "3e9268aaa5b376d836d2ffd84aab075a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7348, "upload_time": "2018-04-13T19:49:04", "url": "https://files.pythonhosted.org/packages/a1/9a/5b9c40e2679ccef4060044e474ef384c6260d02fc6868e1c1905223715cd/canonical_args-0.1r2.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "79005ec51bf8ce9dc236960003f52d1c", "sha256": "bc4a6417ce323b07e775e7d460732a7729dc4cd7fd68e4858fb11bb6e16f5cdf" }, "downloads": -1, "filename": "canonical_args-0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "79005ec51bf8ce9dc236960003f52d1c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 6745, "upload_time": "2018-04-13T22:07:53", "url": "https://files.pythonhosted.org/packages/4b/f6/5e4e10c2f9f6f4492405aac49125ba2b455812dd2c1ed5ea3c7fcfdcdb8f/canonical_args-0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0497ca39f2a3b67e60d0fa1820f01f1c", "sha256": "0bdf432b5bb6878a4a5d3ac684388d535d68f7067b3bb801d72c6ed09b655950" }, "downloads": -1, "filename": "canonical_args-0.2.tar.gz", "has_sig": false, "md5_digest": "0497ca39f2a3b67e60d0fa1820f01f1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7599, "upload_time": "2018-04-13T22:07:55", "url": "https://files.pythonhosted.org/packages/0e/c6/aa328609e4a4aea62bcdc184018844ae6ffde93b733f1784427bcae89857/canonical_args-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "1f39f398702bc2435638307ce4a2b05c", "sha256": "727ace991cfd6a9c759e0aecde63576017bf7c7d19b35212f51c537f3aeadb15" }, "downloads": -1, "filename": "canonical_args-0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "1f39f398702bc2435638307ce4a2b05c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7258, "upload_time": "2018-04-14T16:54:59", "url": "https://files.pythonhosted.org/packages/31/eb/92e502180bf5e6b7f17713eaae250f6b197e484abd5dc2a759e8ef0adefc/canonical_args-0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2dd55597f06c6689bab5541ba81bba74", "sha256": "4a56f2f6cb43fb4052054a00f44a1d0931d42ef41326e94d592adec677c042ef" }, "downloads": -1, "filename": "canonical_args-0.3.tar.gz", "has_sig": false, "md5_digest": "2dd55597f06c6689bab5541ba81bba74", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8380, "upload_time": "2018-04-14T16:55:10", "url": "https://files.pythonhosted.org/packages/38/3e/2cb543fc82fdcf33d53bf52927eef46b7b8871fc7ed35ea94bc7956471dc/canonical_args-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "130a8cf485398d5886628d8f749ba52c", "sha256": "2b219373d7880040a0f1bbd01cd67e3c0163b0b17747cd0c18a5f88395fe667c" }, "downloads": -1, "filename": "canonical_args-0.3.1-py2-none-any.whl", "has_sig": false, "md5_digest": "130a8cf485398d5886628d8f749ba52c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8221, "upload_time": "2018-04-15T00:52:39", "url": "https://files.pythonhosted.org/packages/59/7e/9f9cfd1f6491b22da54c3bb571e42f017edbe3469eb31c8644cf5083502a/canonical_args-0.3.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8a9ec1ef9b2ddf643e250b47040828b6", "sha256": "986f7792af3616a19fd98811904bffbff365526617960fffa9dc25629962d3c3" }, "downloads": -1, "filename": "canonical_args-0.3.1.tar.gz", "has_sig": false, "md5_digest": "8a9ec1ef9b2ddf643e250b47040828b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9703, "upload_time": "2018-04-15T00:52:40", "url": "https://files.pythonhosted.org/packages/f8/57/e284fcb08b3d87acfdad394e48bfdfac0796a3a56e3d21047a8c0de6c844/canonical_args-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "c888556448ff3915108fe7327bff93eb", "sha256": "95f79983cc647fc008972376585524753e7f21a2a38d34ddbcbdde026669fe3c" }, "downloads": -1, "filename": "canonical_args-0.3.2-py2-none-any.whl", "has_sig": false, "md5_digest": "c888556448ff3915108fe7327bff93eb", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8683, "upload_time": "2018-04-16T22:56:17", "url": "https://files.pythonhosted.org/packages/b0/d2/25625cd8e83c7047c1d8e97335f197dc25f70a78bef265708d8e929b1d1b/canonical_args-0.3.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f7b8664c1b7342873f5e2957709a0dd", "sha256": "3505b3596c4238dcf71ff4d59a02a45ddbdb963c4773e642ea308aa52ff34d4a" }, "downloads": -1, "filename": "canonical_args-0.3.2.tar.gz", "has_sig": false, "md5_digest": "0f7b8664c1b7342873f5e2957709a0dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10157, "upload_time": "2018-04-16T22:56:18", "url": "https://files.pythonhosted.org/packages/ec/7b/3d8316d16646bd842b88ab73e4345f59bedca49ebb83059b86a5b59cdc1a/canonical_args-0.3.2.tar.gz" } ], "0.3.2.post1": [ { "comment_text": "", "digests": { "md5": "21b1114be0366594f7bbd55f3ddf7b81", "sha256": "21fd6ac47564f7dee5bac205ecc809fbafdc9dae50a6c6a446d6a5b29c997b5b" }, "downloads": -1, "filename": "canonical_args-0.3.2.post1-py2-none-any.whl", "has_sig": false, "md5_digest": "21b1114be0366594f7bbd55f3ddf7b81", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8847, "upload_time": "2018-04-19T21:02:21", "url": "https://files.pythonhosted.org/packages/54/38/e2fced391b4f6a2870246338fea8137b159e3b461dfe050f998b2c1b7981/canonical_args-0.3.2.post1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dbfc3a54d2d71bb05688882982355e1c", "sha256": "e94d6bb533b173436a2d4d73ccffadc94276db348cb032dff39f0037b5fded44" }, "downloads": -1, "filename": "canonical_args-0.3.2.post1.tar.gz", "has_sig": false, "md5_digest": "dbfc3a54d2d71bb05688882982355e1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10268, "upload_time": "2018-04-19T21:02:22", "url": "https://files.pythonhosted.org/packages/9c/97/34042b54eb05fe20aaf57bbbced5aa78ce86071803203665db9168d9afe7/canonical_args-0.3.2.post1.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "d9fcd4a4036738bb17ce530c9c0df329", "sha256": "d14999f9f31daa0b4ace3c3ebc8121df13436ca45ce940149bf965fef67fae70" }, "downloads": -1, "filename": "canonical_args-0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "d9fcd4a4036738bb17ce530c9c0df329", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8670, "upload_time": "2018-04-20T19:00:49", "url": "https://files.pythonhosted.org/packages/a5/5e/f639f945c5fb9b536182e15940babbbb39d201c658675e4692c1cedffcf3/canonical_args-0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3789891407a1fc6610e41f697faf0886", "sha256": "e7c55f164f8946441a1e4b0cbb771fb6af2e077a388363853fdb87b7780295f7" }, "downloads": -1, "filename": "canonical_args-0.4.tar.gz", "has_sig": false, "md5_digest": "3789891407a1fc6610e41f697faf0886", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10187, "upload_time": "2018-04-20T19:00:51", "url": "https://files.pythonhosted.org/packages/88/5e/20347fd83400e2436e8ca4f8f8158d244d885dce3a66a6bbaa68ba21ce92/canonical_args-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "44a47428d850b37eaa548aecd18adf51", "sha256": "b9591ced0a08d59a0512fd3fce7584920a76fb898698bb975884f58895897f99" }, "downloads": -1, "filename": "canonical_args-0.4.1-py2-none-any.whl", "has_sig": false, "md5_digest": "44a47428d850b37eaa548aecd18adf51", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8759, "upload_time": "2018-05-18T03:47:29", "url": "https://files.pythonhosted.org/packages/0b/af/c8e0009c4fceeefd19f59e259de74733b69577188b36cca5923c712da0ad/canonical_args-0.4.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba4dba8d9ba8b96ca83820f89a4b30ef", "sha256": "01fc3263e7775c887800b570e41db4c6347d2bb3bc1943c88bbcfbfbede4a964" }, "downloads": -1, "filename": "canonical_args-0.4.1.tar.gz", "has_sig": false, "md5_digest": "ba4dba8d9ba8b96ca83820f89a4b30ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10320, "upload_time": "2018-05-18T03:47:31", "url": "https://files.pythonhosted.org/packages/e1/9f/e0376ced3eff03f0e00f44c73e3a49b00ff2d790b64279e89fec4e0d9cd7/canonical_args-0.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "44a47428d850b37eaa548aecd18adf51", "sha256": "b9591ced0a08d59a0512fd3fce7584920a76fb898698bb975884f58895897f99" }, "downloads": -1, "filename": "canonical_args-0.4.1-py2-none-any.whl", "has_sig": false, "md5_digest": "44a47428d850b37eaa548aecd18adf51", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8759, "upload_time": "2018-05-18T03:47:29", "url": "https://files.pythonhosted.org/packages/0b/af/c8e0009c4fceeefd19f59e259de74733b69577188b36cca5923c712da0ad/canonical_args-0.4.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba4dba8d9ba8b96ca83820f89a4b30ef", "sha256": "01fc3263e7775c887800b570e41db4c6347d2bb3bc1943c88bbcfbfbede4a964" }, "downloads": -1, "filename": "canonical_args-0.4.1.tar.gz", "has_sig": false, "md5_digest": "ba4dba8d9ba8b96ca83820f89a4b30ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10320, "upload_time": "2018-05-18T03:47:31", "url": "https://files.pythonhosted.org/packages/e1/9f/e0376ced3eff03f0e00f44c73e3a49b00ff2d790b64279e89fec4e0d9cd7/canonical_args-0.4.1.tar.gz" } ] }