{ "info": { "author": "Mark Utting", "author_email": "m.utting@uq.edu.au", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Testing" ], "description": "# Agilkia: A Python Toolkit to Support AI-for-Testing\n\nThis toolkit is intended to make it easier to build testing tools that learn\nfrom traces of customer behaviors, analyze those traces for common patterns\nand unusual behaviors (e.g. using clustering techniques), learn machine learning (ML)\nmodels of typical behaviors, and use those models to generate smart tests that\nimitate customer behaviors.\n\nAgilkia is intended to provide a storage and interchange format that makes it easy to\nbuilt 'smart' tools on top of this toolkit, often with just a few lines of code.\nThe main focus of this toolkit is saving and loading traces in a standard *.JSON\nformat, and transforming those traces to and from lots of other useful formats,\nincluding:\n\n * Pandas DataFrames (for data analysis and machine learning);\n * ARFF files (for connection to Weka and the StackedTrees tools);\n * SciPy Linkage matrices (for hierarchical clustering and drawing Dendrograms);\n * CSV files in application-specific formats (requires writing some Python code).\n\nThe key datastructures supported by this library are:\n\n * TraceSet = a sequence of Trace objects\n * Trace = a sequence of Event objects\n * Event = one interaction with a web service/site, with an action name, inputs, outputs.\n\nIn addition, note that the TraceSet can store 'clustering' information about the\ntraces (flat clusters and optional hierarchical clustering) and all three of the\nabove objects include various kinds of 'meta-data'. For example, each Event\nobject can contain a timestamp, and each TraceSet contains an 'event_chars' dictionary\nthat maps each kind of event to a single character to enable concise visualization of traces.\n\n\nThis 'agilkia' library is part of the Philae research project:\n\n http://projects.femto-st.fr/philae/en\n\nIt is open source software under the MIT license.\nSee LICENSE.txt\n\n# Key Features:\n\n* Manage sets of traces (load/save to JSON, etc.).\n* Split traces into smaller traces (sessions).\n* Cluster traces on various criteria, with support for flat and hierarchical clustering.\n* Visualise clusters of tests, to see common / rare behaviours.\n* Convert traces to Pandas DataFrame for data analysis / machine learning.\n* Generate random tests, or 'smart' tests from a machine learning (ML) model.\n* Automated testing of SOAP web services with WSDL descriptions.\n\n\n## About the Name\n\nThe name 'Agilkia' was chosen for this library because it is\nclosely associated with the name 'Philae', and the Agilkia toolkit\nhas been developed as part of the Philae research project.\n\nAgilkia is an island in the reservoir of the Aswan Low Dam, \ndownstream of the Aswan Dam and Lake Nasser, Egypt. \nIt is the current location of the ancient temple of Isis, which was \nmoved there from the islands of Philae after dam water levels rose.\n \nAgilkia was also the name given to the first landing place of the\nPhilae landing craft on the comet 67P/Churyumov\u2013Gerasimenko,\nduring the Rosetta space mission.\n\n\n## People\n\n* Architect and developer: AProf. Mark Utting\n* Project leader: Prof. Bruno Legeard\n\n\n# Example Usages\n\nAgilkia requires Python 3.7 or higher.\nHere is how to install this toolkit using conda:\n```\nconda install -c mark.utting agilkia\n```\n\nHere is a simple example of generating some simple random tests of an imaginary\nweb service running on the URL http://localhost/cash:\n```\nimport agilkia\n\n# sample input values for named parameters\ninput_values = {\n \"username\" : [\"TestUser\"],\n \"password\" : [\"\"] * 9 + [\"bad-pass\"], # wrong 10% of time\n \"version\" : [\"2.7\"] * 9 + [\"2.6\"], # old version 10% of time\n \"account\" : [\"acc100\", \"acc103\"], # test these two accounts equally\n \"deposit\" : [i*100 for i in range(8)], # a range of deposit amounts\n}\n\ndef first_tests():\n tester = agilkia.RandomTester(\"http://localhost/cash\",\n parameters=input_values)\n tester.set_username(\"TestUser\") # will prompt for password\n tests = agilkia.TraceSet([])\n for i in range(10):\n tr = tester.generate_trace(length=30)\n print(f\"========== trace {i}:\\n {tr}\")\n tests.append(tr)\n return tests\n\nfirst_tests().save_to_json(Path(\"tests1.json\"))\n```\n\nAnd here is an example of loading a file containing a single long trace, splitting it into\ncustomer sessions based on a 'sessionID' input field, using SciPy to cluster those sessions\nusing hierarchical clustering, visualizing them as a dendrogram tree, and saving the results.\n```\nfrom pathlib import Path\nimport scipy.cluster.hierarchy as hier\nimport matplotlib.pyplot as plt\nimport agilkia\n\ntraces = agilkia.TraceSet.load_from_json(Path(\"trace.json\"))\nsessions = traces.with_traces_grouped_by(\"sessionID\")\ndata = sessions.get_trace_data(method=\"action_counts\")\ntree = hier.linkage(data)\nhier.dendrogram(tree, 10, truncate_mode=\"level\") # view top 10 levels of tree\nplt.show()\ncuts = hier.cut_tree(tree, [3]) # cut the tree to get 3 clusters\nsessions.set_clusters(cuts[:,0], tree)\nsessions.save_to_json(Path(\"sessions_clustered.json\"))\n```\n\nFor more complete examples, see the *.py scripts in the `examples/scanner` directory in the\nAgilkia source code distribution (`https://github.com/utting/agilkia`) and the README there.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/utting/agilkia", "keywords": "automated testing, smart testing, machine learning test models, Philae", "license": "", "maintainer": "", "maintainer_email": "", "name": "agilkia", "package_url": "https://pypi.org/project/agilkia/", "platform": "", "project_url": "https://pypi.org/project/agilkia/", "project_urls": { "Homepage": "https://github.com/utting/agilkia" }, "release_url": "https://pypi.org/project/agilkia/0.8.0/", "requires_dist": [ "flit>=3.0", "ipython>=7.13.0", "jsonpickle>=1.3", "matplotlib>=3.2", "pandas>=1.0.3", "pillow>=7.0", "pip>=20.0", "requests>=2.23", "scikit-learn>=0.22", "scipy>=1.4.1", "zeep>=3.4", "pytest >=6.2.0 ; extra == \"test\"", "pytest-cov>=2.11 ; extra == \"test\"", "mypy>=0.740 ; extra == \"test\"" ], "requires_python": ">=3.7", "summary": "Automated smart testing strategies for web services.", "version": "0.8.0", "yanked": false, "yanked_reason": null }, "last_serial": 12262934, "releases": { "0.2.2": [ { "comment_text": "", "digests": { "md5": "b8f96ef69589fc8a94f77338c00efab2", "sha256": "091529d8b4be8ccfffdd49331996563acdc68663f467e5a825c669fb21fd6442" }, "downloads": -1, "filename": "agilkia-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "b8f96ef69589fc8a94f77338c00efab2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 3.7", "size": 43703, "upload_time": "2019-10-16T13:03:54", "upload_time_iso_8601": "2019-10-16T13:03:54.988732Z", "url": "https://files.pythonhosted.org/packages/a4/12/d1553f206648bb1b5d7c2e0045c5e221a7dddf7acda6e3cfff1c029f91f7/agilkia-0.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "efaaba8a1259451477eadbc5244e48b0", "sha256": "8abf8110527a1591f58eaa4f8b34bc768fd0824a3814eec81ef28cb656ea5633" }, "downloads": -1, "filename": "agilkia-0.2.2.tar.gz", "has_sig": false, "md5_digest": "efaaba8a1259451477eadbc5244e48b0", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.7", "size": 23593, "upload_time": "2019-10-16T13:04:29", "upload_time_iso_8601": "2019-10-16T13:04:29.660361Z", "url": "https://files.pythonhosted.org/packages/47/cd/2665edf9e4936c6c4d732bc57fb71918dc8c2dd2e85863d70ef41213c0b9/agilkia-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "7072d4ef116ce215b23eae391b11b0a5", "sha256": "1a80cff75bbaa21a3b82e6ec487167f458cc80c38ce2d8be3eb3adaf3174b9a2" }, "downloads": -1, "filename": "agilkia-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7072d4ef116ce215b23eae391b11b0a5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 3.7", "size": 57321, "upload_time": "2019-10-19T10:04:24", "upload_time_iso_8601": "2019-10-19T10:04:24.669891Z", "url": "https://files.pythonhosted.org/packages/84/e1/869a1426ebb55f6eb32522293b84942e82d64218f13de85280c63533b96d/agilkia-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "10b356f31fe859dd2b296932dd7144df", "sha256": "eb7b5dceb8d52eab5b8d59f13b10480b4e0dc7fedb4ac6b1d555c09a71793f5c" }, "downloads": -1, "filename": "agilkia-0.3.0.tar.gz", "has_sig": false, "md5_digest": "10b356f31fe859dd2b296932dd7144df", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.7", "size": 38213, "upload_time": "2019-10-19T10:04:40", "upload_time_iso_8601": "2019-10-19T10:04:40.500421Z", "url": "https://files.pythonhosted.org/packages/13/b8/90d394403cefcc0a5703e157d1f1da4dcc635af40b8c0329e54cfde642e9/agilkia-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "495e7173c02efa328031aa65a8ca9d1c", "sha256": "8cd140b8221924dd0568032cae0d80ef861acbb2054be56281dca3c8e1c4bf10" }, "downloads": -1, "filename": "agilkia-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "495e7173c02efa328031aa65a8ca9d1c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 3.7", "size": 57688, "upload_time": "2019-10-19T19:04:34", "upload_time_iso_8601": "2019-10-19T19:04:34.526764Z", "url": "https://files.pythonhosted.org/packages/d9/65/ec8fd39ea11d466de0d22a4050b27e1f9883a229aad5000749d30fc91294/agilkia-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f0ca5e21cba2497d1e1b3d608c05e051", "sha256": "5637e0bf096cbb7f05e05d8713dd693f681f50316d064b937883fbf75f403f66" }, "downloads": -1, "filename": "agilkia-0.3.1.tar.gz", "has_sig": false, "md5_digest": "f0ca5e21cba2497d1e1b3d608c05e051", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.7", "size": 38504, "upload_time": "2019-10-19T19:04:37", "upload_time_iso_8601": "2019-10-19T19:04:37.150783Z", "url": "https://files.pythonhosted.org/packages/4b/e1/6c8ee036ecea4cc5f0d5ee2064b30c26f2afdb6c9e0d5a29199f5da3a157/agilkia-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "bf6e6b19c5e26e4b1dcb94a335fdfec4", "sha256": "4de6ef6fb4a82dec658686ddd98a35d481a2339047243e115f3f3e75c5675a66" }, "downloads": -1, "filename": "agilkia-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bf6e6b19c5e26e4b1dcb94a335fdfec4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<3.8", "size": 60599, "upload_time": "2019-10-28T07:53:34", "upload_time_iso_8601": "2019-10-28T07:53:34.782624Z", "url": "https://files.pythonhosted.org/packages/da/18/f870e56d97006f907e6162cefc1fe9d3c2465eba101a93ca32628f9691cf/agilkia-0.4.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d98324aa05b1845350a7526f8b410753", "sha256": "916232c7fc4530356715862041e7f9f1100bac8f5dd8526ca1c0bc23c00525bb" }, "downloads": -1, "filename": "agilkia-0.4.2.tar.gz", "has_sig": false, "md5_digest": "d98324aa05b1845350a7526f8b410753", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<3.8", "size": 44400, "upload_time": "2019-10-28T07:53:41", "upload_time_iso_8601": "2019-10-28T07:53:41.096115Z", "url": "https://files.pythonhosted.org/packages/2f/e5/1de2bd74e55415c72c432e1d20dbb1813fcbbc2901366c149ce731ab83d7/agilkia-0.4.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "577116e15af2c0b69274de0f544dbb55", "sha256": "04f81aa6ce9acde267c4d9266c5eda5e8f2a92a91e3bd355fae82a42e9f68a41" }, "downloads": -1, "filename": "agilkia-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "577116e15af2c0b69274de0f544dbb55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<3.8", "size": 77128, "upload_time": "2019-12-11T00:18:40", "upload_time_iso_8601": "2019-12-11T00:18:40.800651Z", "url": "https://files.pythonhosted.org/packages/7b/8e/3f4c3c10c7bf547a3e8a68ac6339e999164b7bfc86489196951281c9dcfb/agilkia-0.5.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c29b55ca3a7020a9e2d186463fcc4ced", "sha256": "5ff1a4457cfe010bb6a84161a89ace923eddeabee9c92c1641e358ead24b84c0" }, "downloads": -1, "filename": "agilkia-0.5.0.tar.gz", "has_sig": false, "md5_digest": "c29b55ca3a7020a9e2d186463fcc4ced", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<3.8", "size": 720795, "upload_time": "2019-12-11T00:18:49", "upload_time_iso_8601": "2019-12-11T00:18:49.830538Z", "url": "https://files.pythonhosted.org/packages/43/47/73b1f1db2d1fab4d8c6c05255664652dc74d53348b87daaff56fc416d56a/agilkia-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "ade92d30d1e979c2dd22a821531228ac", "sha256": "077fb290d35e607e691e93701b5488fb214b5fc6569b5a2533b8b6f61f06f61d" }, "downloads": -1, "filename": "agilkia-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ade92d30d1e979c2dd22a821531228ac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<3.8", "size": 25793, "upload_time": "2019-12-11T01:34:25", "upload_time_iso_8601": "2019-12-11T01:34:25.084240Z", "url": "https://files.pythonhosted.org/packages/18/1d/98c85ba953a9713213d43406acce8ea5d1f2591e1635d87bcd5da9950558/agilkia-0.5.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "68c5d9b43291b9c470e71b1e2614f07a", "sha256": "0daaa4af71ba5fe958da104927ebd10611aaa2976fc1bf3d35ad39084afb7591" }, "downloads": -1, "filename": "agilkia-0.5.1.tar.gz", "has_sig": false, "md5_digest": "68c5d9b43291b9c470e71b1e2614f07a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<3.8", "size": 720792, "upload_time": "2019-12-11T01:34:47", "upload_time_iso_8601": "2019-12-11T01:34:47.563714Z", "url": "https://files.pythonhosted.org/packages/f5/08/7f5caed7fe9d3fb647d14b0c7070eea93d51afd85737313751219a95b33d/agilkia-0.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "191bbe52e54445b34095cf1db34c0606", "sha256": "e3bcb7a365c7f48c4d6f8c4d7fd3d696933149774b825eb4f608683819d966c9" }, "downloads": -1, "filename": "agilkia-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "191bbe52e54445b34095cf1db34c0606", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<3.8", "size": 27784, "upload_time": "2020-03-30T11:45:02", "upload_time_iso_8601": "2020-03-30T11:45:02.490327Z", "url": "https://files.pythonhosted.org/packages/5b/de/bbcb6293223fe4537bc8e24e7d1acddf57d3fa0ef5356dc21fee1d3486a5/agilkia-0.6.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a03fe89fd3881bd9f8a9e0eb8b6ec66a", "sha256": "4c49ec2df465c45f7e8c06cc79f6b22173776a52bc08d5e926195c158fd476aa" }, "downloads": -1, "filename": "agilkia-0.6.0.tar.gz", "has_sig": false, "md5_digest": "a03fe89fd3881bd9f8a9e0eb8b6ec66a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<3.8", "size": 742972, "upload_time": "2020-03-30T11:45:09", "upload_time_iso_8601": "2020-03-30T11:45:09.731888Z", "url": "https://files.pythonhosted.org/packages/7f/55/8c57ac3096cfa00e62b518791402b324eb0c511cda76ddc32d8d33cea309/agilkia-0.6.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "cce9d3c110baf4051b4c66f1a28a8447", "sha256": "44e78c5ded12eb5bd9128c57b9fb7dff1f05047e4d3e170a370d1d8496725ccc" }, "downloads": -1, "filename": "agilkia-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cce9d3c110baf4051b4c66f1a28a8447", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 31429, "upload_time": "2021-05-10T06:36:18", "upload_time_iso_8601": "2021-05-10T06:36:18.063307Z", "url": "https://files.pythonhosted.org/packages/b0/82/b4ed1098b3725e6934c398fdf4ce625cb0ce43113190b2ea9f3f592a8433/agilkia-0.7.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a29dffb4163d2f902ce2ed58fd7c902f", "sha256": "4b947c05883c478e7c8f1bd0b55c3cd181d43b52d1c4be598fa95c7db7893f3c" }, "downloads": -1, "filename": "agilkia-0.7.0.tar.gz", "has_sig": false, "md5_digest": "a29dffb4163d2f902ce2ed58fd7c902f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 789704, "upload_time": "2021-05-10T06:36:24", "upload_time_iso_8601": "2021-05-10T06:36:24.271804Z", "url": "https://files.pythonhosted.org/packages/ad/51/c0684d1430116be9ad838fc392ef68426bc97162b5b5c109f1e46dc31943/agilkia-0.7.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "e919b3a7156519fe136d9afe2b47236c", "sha256": "e1dcae55a373dc3435ba294249e15adde73dc86e0c7026e0b7912f1051553f7d" }, "downloads": -1, "filename": "agilkia-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e919b3a7156519fe136d9afe2b47236c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 43324, "upload_time": "2021-12-10T02:28:31", "upload_time_iso_8601": "2021-12-10T02:28:31.818557Z", "url": "https://files.pythonhosted.org/packages/62/60/6c86b57ae537fac36c3a1255fee4f026ec03d24b7d630feaa52326ad71d5/agilkia-0.8.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f86414af2275d4d00e2f1f2b8d656397", "sha256": "18eaaf1e192d863e96453b1da0a687793ced0c1d025320ca0373d414194a7863" }, "downloads": -1, "filename": "agilkia-0.8.0.tar.gz", "has_sig": false, "md5_digest": "f86414af2275d4d00e2f1f2b8d656397", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 828279, "upload_time": "2021-12-10T02:28:41", "upload_time_iso_8601": "2021-12-10T02:28:41.556534Z", "url": "https://files.pythonhosted.org/packages/81/73/7263193f4808ec89bc869c78e7aa566530b0dd71c87ef3f27aff320c2389/agilkia-0.8.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e919b3a7156519fe136d9afe2b47236c", "sha256": "e1dcae55a373dc3435ba294249e15adde73dc86e0c7026e0b7912f1051553f7d" }, "downloads": -1, "filename": "agilkia-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e919b3a7156519fe136d9afe2b47236c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 43324, "upload_time": "2021-12-10T02:28:31", "upload_time_iso_8601": "2021-12-10T02:28:31.818557Z", "url": "https://files.pythonhosted.org/packages/62/60/6c86b57ae537fac36c3a1255fee4f026ec03d24b7d630feaa52326ad71d5/agilkia-0.8.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f86414af2275d4d00e2f1f2b8d656397", "sha256": "18eaaf1e192d863e96453b1da0a687793ced0c1d025320ca0373d414194a7863" }, "downloads": -1, "filename": "agilkia-0.8.0.tar.gz", "has_sig": false, "md5_digest": "f86414af2275d4d00e2f1f2b8d656397", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 828279, "upload_time": "2021-12-10T02:28:41", "upload_time_iso_8601": "2021-12-10T02:28:41.556534Z", "url": "https://files.pythonhosted.org/packages/81/73/7263193f4808ec89bc869c78e7aa566530b0dd71c87ef3f27aff320c2389/agilkia-0.8.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }