{ "info": { "author": "LOGILAB S.A. (Paris, FRANCE)", "author_email": "contact@logilab.fr", "bugtrack_url": null, "classifiers": [], "description": "========\n Narval\n========\n\nSummary\n=======\n\nNarval is a CubicWeb based framework to run automated tests. It\nconsists in 2 parts:\n\n- the narval cube which implements the schema and some web UIs to\n create, configure and run test campaigns, and\n\n- the narval bot which waits for jobs to execute. It polls the\n CubicWeb application for new tasks to run (called Plans in narval's\n jargon), and executes them when some are waiting for exectution.\n\nThe narval bot communicates with the web application by doing HTTP(S)\nrequests.\n\nRecipe and Plan\n===============\n\nThe schema of the cube defines 2 entities:\n\n:Recipe:\n represents a Python script to be executed to run the tests,\n\n:Plan: represents the execution of a Recipe; it has a workflow (with\n the following states: 'ready', 'running', 'done', 'error',\n 'killed'); when executed, the execution log file (stdout and\n stderr) of the recipe is attached to the `Plan` (via the\n `execution_log` relation).\n\nExecution process of a Recipe\n=============================\n\nIn order to run a `Recipe`, one must create a `Plan` (an execution\nplan).\n\nIn the web UI, this can be done via the `Start Plan` button on a `Recipe` main\nview. This creates a new `Plan` entity (which references the `Recipe`) in the\n`ready` state.\n\nThen, as soon as the narval bot asks the application for waiting jobs\n(i.e. `Plan` in the `ready` workflow state), it eventually gets the\n`Plan` eid.\n\nThe narval daemon then spawns a new process to manage the execution of\nthe plan in a separate process; the executed command is something like::\n\n narval run-plan narval https://webapp.com/3071/ --uid narval --threads 1 --max-reprieve 1min --log-threshold DEBUG\n\nwhere `3071` is the eid of the `Plan` to be executed. The `options`\nattribute of the `Plan` (which is a string of the form:\n`\"key1=value1\\nkey2=value2n[...]\"`) is converted into command line\narguments (`--key1 value1 --key2 value2 [...]`) to be passed to the\n`run-plan` command.\n\nThis `run-plan` narval command retrieves the parameters of the `Plan`\n(the Python code to be executed and some execution options), then:\n\n- it fires the `start` workflow transition (by means of a HTTP request),\n\n- it executes the `Recipe` Python script (by means of an `execfile`\n call); the script is executed with a globals (and locals)\n dictionary defining one variable, `plan`, which references a Python\n object having the folowing attributes:\n\n - `cnxh`: an HTTP connection handler allowing to make requests to the\n web application from the executed script,\n\n - `plandata`: a dictionary holding the executed `Plan` parameters,\n\n - `options`: a dictionary with all defined options of the `Plan`,\n\n - `name`: the name of the `Recipe` to be executed,\n\n - `script`: a string with the Python script to run.\n\n Warning: the Python script is executed in the context of the\n `run-plan` Python process.\n\n- it fires the transition:\n\n - `end` if the execution went fine (did not crash),\n - `kill` if the execution exceeded some resource limits (memory, execution time),\n - `fail` if some uncatched Exception has been raised.\n\n\nWhen the `narval run-plan` shell command returns, the `bot` checks for\nthe return code, retrieves the `stdout` and `stderr` of the process and\nuploads them as the `execution_log` of the `Plan`, so the user can have\naccess to the full execution log (print statements, logging messages,\netc.).\n\nPlugins\n=======\n\nUser can write plugins that will be importable from recipes when\nexecuted by ``narval run-plan``. The normal way is to write a cubicweb\ncube in which you add a ``_narval`` directory where you can add python\nmodules and packages. When run from source directory, the ``_narval``\ndirectory of every available cube will be added in the PYTHONPATH of\nthe ``narval`` command.\n\nPlease refer to the apycot_ cube as an example.\n\n.. _apycot: http://www.cubiweb.org/project/apycot", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.cubicweb.org/project/cubicweb-narval", "keywords": null, "license": "LGPL", "maintainer": null, "maintainer_email": null, "name": "cubicweb-narval", "package_url": "https://pypi.org/project/cubicweb-narval/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/cubicweb-narval/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://www.cubicweb.org/project/cubicweb-narval" }, "release_url": "https://pypi.org/project/cubicweb-narval/4.2.3/", "requires_dist": null, "requires_python": null, "summary": "the Narval agent", "version": "4.2.3" }, "last_serial": 2502093, "releases": { "4.0.0": [ { "comment_text": "", "digests": { "md5": "ddaa3ffc5f0c232d32f612d70a552951", "sha256": "e6483a976637cb40f9eb472128d75f6d8211fc05f75d6b2782902d608565586f" }, "downloads": -1, "filename": "cubicweb-narval-4.0.0.tar.gz", "has_sig": false, "md5_digest": "ddaa3ffc5f0c232d32f612d70a552951", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40197, "upload_time": "2014-05-22T10:26:42", "url": "https://files.pythonhosted.org/packages/70/08/a479150874e4fdc2d32a1adbf9b439bdf46b1f19d4d28be162e75d247725/cubicweb-narval-4.0.0.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "67709548b4c5cb060dca7f1b0410f7ed", "sha256": "dbb2fbf2e31dad2ae17a5a1a024bb7f1fa6ef4c79be67cc19ca9311520f1ac90" }, "downloads": -1, "filename": "cubicweb-narval-4.1.0.tar.gz", "has_sig": false, "md5_digest": "67709548b4c5cb060dca7f1b0410f7ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37632, "upload_time": "2014-07-11T14:58:47", "url": "https://files.pythonhosted.org/packages/61/f6/c7e278e8b8aa4dbecb65e06b7e7847e310bddec2caab5a0d4e6e03bcc2bd/cubicweb-narval-4.1.0.tar.gz" } ], "4.1.1": [ { "comment_text": "", "digests": { "md5": "b4b2e4d17d931d28957d9d1291b7eae8", "sha256": "f10e0182b84e6ddfca6692c32d3d01b169b04d1c3cd2bf73953a0b3175750cf6" }, "downloads": -1, "filename": "cubicweb-narval-4.1.1.tar.gz", "has_sig": false, "md5_digest": "b4b2e4d17d931d28957d9d1291b7eae8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37660, "upload_time": "2015-01-05T12:46:34", "url": "https://files.pythonhosted.org/packages/c4/bb/27524fb205e454323721ed72c10d6045a12700ddef9b459b94c4a9dae594/cubicweb-narval-4.1.1.tar.gz" } ], "4.1.2": [ { "comment_text": "", "digests": { "md5": "505c2d84bb4e4cb4538dbd0d20dc27af", "sha256": "5b0dab01d3f434d348b6a70129eab79f8b9390b6baedca3912cf111d708e8794" }, "downloads": -1, "filename": "cubicweb-narval-4.1.2.tar.gz", "has_sig": false, "md5_digest": "505c2d84bb4e4cb4538dbd0d20dc27af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36250, "upload_time": "2015-03-09T15:27:54", "url": "https://files.pythonhosted.org/packages/38/83/538fd64b1a8255bed8605556e21d61c775a247180e8e07c1f4d3bc2fb68a/cubicweb-narval-4.1.2.tar.gz" } ], "4.2.0": [ { "comment_text": "", "digests": { "md5": "1c3c233fb371737c5076e384956d066f", "sha256": "698facd386f8892bfee968ebf9187cd35c21e4875095051ef3d89346d42f5f83" }, "downloads": -1, "filename": "cubicweb-narval-4.2.0.tar.gz", "has_sig": false, "md5_digest": "1c3c233fb371737c5076e384956d066f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36498, "upload_time": "2015-07-24T16:13:20", "url": "https://files.pythonhosted.org/packages/ae/e4/9cf6e28f91a770e0ec55d16430c9db258a317667f29ba6f9505ea4f9ecc1/cubicweb-narval-4.2.0.tar.gz" } ], "4.2.1": [ { "comment_text": "", "digests": { "md5": "e6088ef3e108d5ef7b09fdadb705c258", "sha256": "74090a61cfe9c622d8c99b76a10a090bd4794041b4191db9ca824e3e7e8c68f3" }, "downloads": -1, "filename": "cubicweb-narval-4.2.1.tar.gz", "has_sig": false, "md5_digest": "e6088ef3e108d5ef7b09fdadb705c258", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36502, "upload_time": "2015-07-28T21:32:11", "url": "https://files.pythonhosted.org/packages/98/d2/398fcf6ee4e6299024a4c1e0d3e2cdc176d795fb3ca5c6bb1b99324ab214/cubicweb-narval-4.2.1.tar.gz" } ], "4.2.2": [ { "comment_text": "", "digests": { "md5": "32fa2ddea8c5ec4fe5cb00d23a5f6a27", "sha256": "98861ed684b9423429200b1c7e5bfa9c98398641ef1ad0d72527ebe3f0284dba" }, "downloads": -1, "filename": "cubicweb-narval-4.2.2.tar.gz", "has_sig": false, "md5_digest": "32fa2ddea8c5ec4fe5cb00d23a5f6a27", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36597, "upload_time": "2016-01-05T14:02:45", "url": "https://files.pythonhosted.org/packages/8c/ab/86fdf73de099ae0592cf48040242c857c9d24c10b12f8189f2571e1ed88d/cubicweb-narval-4.2.2.tar.gz" } ], "4.2.3": [ { "comment_text": "", "digests": { "md5": "61b90b92d996ac56a8e2acfdef17a3e5", "sha256": "84ea383f7c01cd22e57366a9f6b3dc695e391386a93737290bf2757893080826" }, "downloads": -1, "filename": "cubicweb-narval-4.2.3.tar.gz", "has_sig": false, "md5_digest": "61b90b92d996ac56a8e2acfdef17a3e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39471, "upload_time": "2016-12-06T10:42:56", "url": "https://files.pythonhosted.org/packages/df/28/e54692679bc14962de6ab80e44e36b9e5752765559a67d6f9e1ae8e38bd6/cubicweb-narval-4.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "61b90b92d996ac56a8e2acfdef17a3e5", "sha256": "84ea383f7c01cd22e57366a9f6b3dc695e391386a93737290bf2757893080826" }, "downloads": -1, "filename": "cubicweb-narval-4.2.3.tar.gz", "has_sig": false, "md5_digest": "61b90b92d996ac56a8e2acfdef17a3e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39471, "upload_time": "2016-12-06T10:42:56", "url": "https://files.pythonhosted.org/packages/df/28/e54692679bc14962de6ab80e44e36b9e5752765559a67d6f9e1ae8e38bd6/cubicweb-narval-4.2.3.tar.gz" } ] }