{ "info": { "author": "Tim Treptow", "author_email": "tim.treptow@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7" ], "description": "pordego\n=======\n\nSummary\n-------\nPordego provides a simple, pluggable command line tool for executing various static analyses such as\ncode complexity, dependency analysis, etc.. The goal is to provide a simple, configurable tool that CI software such as Bamboo can call as a step in the build process.\n\nThe pordego package itself only contains the command line tool (also called \"pordego\") and the configuration parser.\nThe actual analyses are performed by additional packages (see below for a list of known packages)\n\n\"Pordego\" means \"gate\" in Esperanto. The tool acts as a gate for the CI process and keeps crappy code out.\n\nInstallation\n------------\nThe easiest way to install is to run\n\n.. code-block:: bash\n\n $ pip install pordego\n\nThis will install the command line tool, which does not do much on it's own. You will want to install one or more plugins, such as:\n\n.. code-block:: bash\n\n $ pip install pordego-complexity\n $ pip install pordego-dependency\n\npordego will automatically detect installed plugins\n\nUsage\n-----\nRun the analyses:\n\n.. code-block:: bash\n\n $ pordego run \n\nShow the installed plugins:\n\n.. code-block:: bash\n\n $ pordego show\n\nRun Configuration File\n######################\nThe pordego tool accepts a single configuration file in yml format.\nThe configuration file has top level configuration parameters called \"analysis\" and \"output\" for configuring the analysis and output plugins respectivly.\nThe values of \"analysis\" and \"output\" are lists of plugin specific configuration. The results of all the confiugured analyses are passed to all the output plugins.\n\nThe plugin specific configuration must contain a parameter called \"plugin_name\" which must match the name of one of the instlalled plugins of the section type.\nPlugin configurations can optionally specify a parameter called \"name\" that is passed to the output instead of the plugin name.\nThis is useful for distinguishing analyses when the sam analysis plugin is run with multiple configurations.\n\nPlugins are exectued in the order they are specified in the file (excpet that analyses are always executed before output regardless of the position of the analysis and output configs), and the same plugin can be executed multiple times with different configuration\n\n\nExample\n^^^^^^^\nIn this example, one plugin called \"myplugin\" will be run twice with different configs. The output is sent to stdout. The plugin takes two parameters, one of which is a list.\n\n.. code-block:: yaml\n\n ---\n analysis:\n - plugin_name: myplugin\n name: Check config 1\n myplugin_param_1: config val\n myplugin_param_2:\n - list item 1\n - list item 2\n - plugin_name: myplugin\n name: Check config 2\n myplugin_param_1: some other val\n myplugin_param_2:\n - list item 7\n output:\n - plugin_name: stdout\n\nThe \"myplugin\" entry point (see below) will be passed a dictionary containing (note that the \"plugin_name\" parameter is stripped out):\n\n.. code-block:: python\n\n {\n \"name\": \"Check config 1\"\n \"myplugin_param_1\": \"config val\",\n \"myplugin_param_2\": [\"list item 1\", \"list item 2\"]\n }\n\nAnd then it will be executed again with\n\n.. code-block:: python\n\n {\n \"name\": \"Check config 2\"\n \"myplugin_param_1\": \"some other val\",\n \"myplugin_param_2\": [\"list item 7\"]\n }\n\nIt is also possible to include plugin configurations. For example, in the main config file:\n\n.. code-block:: yaml\n\n ---\n analysis:\n - include: myplugin_config.yml\n\nThe contents of myplugin_config.yml are:\n\n.. code-block:: yaml\n\n ---\n - plugin_name: myplugin\n name: Check config 1\n myplugin_param_1: config val\n myplugin_param_2:\n - list item 1\n - list item 2\n\nNote that the included file only has a list of plugins, not the \"analysis\" tag.\nIt is possible to recursively include files in included files as well as to have plugin configurations and include statements in the same file.\n\n\nPlugins\n-------\n\nKnown Analysis Plugins\n######################\n\n=========== =========== ======================================================= ========\nPlugin Name Maintainer Description Python Package Name\n=========== =========== ======================================================= ========\ncomplexity Tim Treptow Uses the Radon package to check code complexity `pordego-complexity `_\ndependency Tim Treptow Uses the snakefood package to test package dependencies `pordego-dependency `_\n=========== =========== ======================================================= ========\n\nKnown Output Plugins\n####################\n\n=========== =========== ===================================================== ========\nPlugin Name Maintainer Description Python Package Name\n=========== =========== ===================================================== ========\nstdout Tim Treptow Dumps results to stdout pordego (builtin)\njunit Tim Treptow Dumps results to a junit file pordego (builtin)\n=========== =========== ===================================================== ========\n\nAnalysis Plugin Development\n###########################\nPordego uses package entry points to discover analysis plugins. Plugins packages must export an entrypont called \"pordego.analysis\".\n\nExample:\n^^^^^^^^\n.. code-block:: python\n\n setup(\n ...\n entry_points={\"pordego.analysis\": [\"myplugin = mypackage.mymodule:some_function\"]},\n ...\n )\n\nThe function receives a dictionary containing the configuration for the plugin as specified in the file passed to pordego\n\nReturning Errors and Succeess\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFor simplicty's sake, the interaction between the pordego tool and the plugins is minimal. There are three states that a plugin can comminucate depending on what exceptions are raised.\n\n* Don't raise an exception- pordego assumes that the plugin has passed\n* raise AssertionError- pordego assumes that the condition that the plugin is checking (e.g. code complexity) has failed. Pordego prints out the exception but not a stack trace.\n* raise any other exception- pordego assumes that the plugin or configuration is in error so it prints out a stack trace to aid in debugging\n\nOutput Plugin Development\n#########################\n\nOutput plugins are specified with the \"pordego.output\" entry point. The entry point function must take two parameters.\n\nThe first parameter is a list of plugin outputs.\nEach list item is a tuple containing:\n\n0. the analysis name as specified by the \"name\" parameter in the analysis plugin config, or the plugin name if \"name\" does not exist.\n1. The second parameter is a string containing a failure message or None if the plugin did not fail.\n2. The third parameter is a tuple containing exception info (as returned by sys.exc_info()) if there was an error with the test, or None if there was no error\n\nThe second parameter to the output plugin entry point is the plugin configuration as specified in the configuration file", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/ttreptow/pordego/tarball/1.2.1", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ttreptow/pordego", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "pordego", "package_url": "https://pypi.org/project/pordego/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pordego/", "project_urls": { "Download": "https://github.com/ttreptow/pordego/tarball/1.2.1", "Homepage": "https://github.com/ttreptow/pordego" }, "release_url": "https://pypi.org/project/pordego/1.2.1/", "requires_dist": null, "requires_python": null, "summary": "Command line tool for running configurable static analysis plugins on Python code", "version": "1.2.1" }, "last_serial": 2927553, "releases": { "0.0.3": [ { "comment_text": "", "digests": { "md5": "7da76221c6348f8f7c80d52e1c70d535", "sha256": "cf358e756b0bee599726a9cbd58c160cac7229d7322b196113a8fc03701303b6" }, "downloads": -1, "filename": "pordego-0.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "7da76221c6348f8f7c80d52e1c70d535", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 3959, "upload_time": "2016-06-23T20:14:51", "url": "https://files.pythonhosted.org/packages/4f/87/2ae90d04d04e16504f83e927cac8af4c08e024f037e3cd8541a46fb704ec/pordego-0.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27eac376f5e9223a8d43780c85ea2528", "sha256": "48faa7bb91bd0a39ec7525dde56d32f9aa43538b4f825d4735ab894e2c7a58c6" }, "downloads": -1, "filename": "pordego-0.0.3.zip", "has_sig": false, "md5_digest": "27eac376f5e9223a8d43780c85ea2528", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4527, "upload_time": "2016-06-23T20:14:55", "url": "https://files.pythonhosted.org/packages/02/c4/2e593581b3429db1ccae168808649dcb87368ddd6751ab0d76172e8b2c24/pordego-0.0.3.zip" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "b095fafaca3eff71ea4effd7ea8b98a7", "sha256": "cb19d80106a54ed89218b997a1040666dd91c0ca61d501ff64f5376cea76fb41" }, "downloads": -1, "filename": "pordego-0.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "b095fafaca3eff71ea4effd7ea8b98a7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 3979, "upload_time": "2016-06-23T21:53:24", "url": "https://files.pythonhosted.org/packages/16/f1/0a5edb5f5375c7927e176a072b773760cd44c698c8a6500d6b4456a19a83/pordego-0.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "528a151940a8d439fcb385cfc8ee4a15", "sha256": "e71127c08a8321a893bbf8fa41377447caff74f62f1a0e00da579219a42a6de0" }, "downloads": -1, "filename": "pordego-0.0.5.zip", "has_sig": false, "md5_digest": "528a151940a8d439fcb385cfc8ee4a15", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4568, "upload_time": "2016-06-23T21:53:20", "url": "https://files.pythonhosted.org/packages/9e/ec/e01c79fe3e6c9f4c59dfa5f058cda587241487da89cc17d2791875a03990/pordego-0.0.5.zip" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "67c9c89c9ab0da20cbcf4d7cc32b0e49", "sha256": "04c68d2bf1a0459617de0c3a2f9747f213b530382c89a5b3fe8c4037e590450f" }, "downloads": -1, "filename": "pordego-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "67c9c89c9ab0da20cbcf4d7cc32b0e49", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4176, "upload_time": "2016-06-23T23:50:25", "url": "https://files.pythonhosted.org/packages/47/15/3d3183b6bb96efb0d40037f8cdcb7d111280c353500adca0384a3b72a803/pordego-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "efe86c7cf8ba54c46d40dea55e9e0b8a", "sha256": "2a06e408a7e6ec280253252f18ab02a591faccb19813c139c89dc9e9b37f4212" }, "downloads": -1, "filename": "pordego-1.0.0.zip", "has_sig": false, "md5_digest": "efe86c7cf8ba54c46d40dea55e9e0b8a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6153, "upload_time": "2016-06-23T23:50:21", "url": "https://files.pythonhosted.org/packages/8d/cb/5dccda11404678dc7d76d6531a9d067379a5dd42796a8a7652c0a4350f1e/pordego-1.0.0.zip" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "c2b56ff3ffc0a7299b5152f2d8b14abe", "sha256": "34cd3d237872a820ddbcf70ea3c79ef5d23c6b19c09c31b6cf0f346d1789c5c6" }, "downloads": -1, "filename": "pordego-1.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "c2b56ff3ffc0a7299b5152f2d8b14abe", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 5731, "upload_time": "2016-06-24T19:52:24", "url": "https://files.pythonhosted.org/packages/b9/b1/702475d7134b7e30431c551180308970b7caa4930887d07383c9a0eb5a96/pordego-1.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06429a94907603862dfed4c2673ec72b", "sha256": "351cf72956e1377adde2d5759e7a2bff68c4d14ddae864673cb8616e609930f5" }, "downloads": -1, "filename": "pordego-1.1.0.zip", "has_sig": false, "md5_digest": "06429a94907603862dfed4c2673ec72b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8299, "upload_time": "2016-06-24T19:52:09", "url": "https://files.pythonhosted.org/packages/c1/0f/4717918e27edae79f71c59ebe72ca86b1b8d113e46aa9a74e4bfa12069a5/pordego-1.1.0.zip" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "0fba3f3ef5fb77f0b326d1ddcf684310", "sha256": "e4d47f5ce4f7b3a24c5cfcada82828f5041519f6c2303ba10017122a1418e33d" }, "downloads": -1, "filename": "pordego-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "0fba3f3ef5fb77f0b326d1ddcf684310", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6267, "upload_time": "2016-06-28T22:47:30", "url": "https://files.pythonhosted.org/packages/0b/4b/6d5d81d1a22d172a33e80327579d4b30ddee8a37829a10cc78fb628eb287/pordego-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2703a62c22022e45ed49834b4884b343", "sha256": "d8f67d3baede38f08802595fc3d9ea3e15554fbe74d752b240c77ce5d6bf7f2e" }, "downloads": -1, "filename": "pordego-1.2.0.zip", "has_sig": false, "md5_digest": "2703a62c22022e45ed49834b4884b343", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8985, "upload_time": "2016-06-28T22:47:25", "url": "https://files.pythonhosted.org/packages/ad/da/aa28a974e7346517f4d2219d1007934fd1e298060436b251064ed8f15b28/pordego-1.2.0.zip" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "e65764bb28670ca7892b53dce2061b7e", "sha256": "761f07de0d082c8f5ddb44a7232a8ca6437900f85f153b8303077897e4dff0bb" }, "downloads": -1, "filename": "pordego-1.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "e65764bb28670ca7892b53dce2061b7e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6669, "upload_time": "2016-09-12T18:45:46", "url": "https://files.pythonhosted.org/packages/42/db/daaf2f18a09cf11ecc37933762a01a21599d437a7d109e7c3219b8c86ea8/pordego-1.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8ff1ff29eb25b9a5593eaeecced18676", "sha256": "cff70b83a3bc56cdbd4a5842813e0cdc161e71966cef8402806e6428af64df36" }, "downloads": -1, "filename": "pordego-1.2.1.tar.gz", "has_sig": false, "md5_digest": "8ff1ff29eb25b9a5593eaeecced18676", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5823, "upload_time": "2017-06-05T21:09:47", "url": "https://files.pythonhosted.org/packages/f0/f8/5b4964ca4157c38bcf08a969dd3b957f54583e07866ddb8e665f020c5059/pordego-1.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e65764bb28670ca7892b53dce2061b7e", "sha256": "761f07de0d082c8f5ddb44a7232a8ca6437900f85f153b8303077897e4dff0bb" }, "downloads": -1, "filename": "pordego-1.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "e65764bb28670ca7892b53dce2061b7e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6669, "upload_time": "2016-09-12T18:45:46", "url": "https://files.pythonhosted.org/packages/42/db/daaf2f18a09cf11ecc37933762a01a21599d437a7d109e7c3219b8c86ea8/pordego-1.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8ff1ff29eb25b9a5593eaeecced18676", "sha256": "cff70b83a3bc56cdbd4a5842813e0cdc161e71966cef8402806e6428af64df36" }, "downloads": -1, "filename": "pordego-1.2.1.tar.gz", "has_sig": false, "md5_digest": "8ff1ff29eb25b9a5593eaeecced18676", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5823, "upload_time": "2017-06-05T21:09:47", "url": "https://files.pythonhosted.org/packages/f0/f8/5b4964ca4157c38bcf08a969dd3b957f54583e07866ddb8e665f020c5059/pordego-1.2.1.tar.gz" } ] }