{ "info": { "author": "Emil Karlen", "author_email": "emil@member.fsf.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Testing", "Topic :: System :: Systems Administration" ], "description": "Tests a command line program by executing it in a temporary sandbox directory and inspecting its result.\n\nOr tests properties of existing files, directories etc.\n\n\nSupports individual test cases and test suites.\n\nExactly has a `Wiki\n`_.\nIt also has a built in help system,\nwhich can, among other things,\ngenerate this `Reference manual\n`_.\n\n\n.. contents::\n\n\nTEST CASES\n========================================\n\nA test case is written as a plain text file.\n\n\nTesting stdin, stdout, stderr, exit code\n------------------------------------------------------------\n\nThe following checks that your new ``my-contacts-program`` reads a contact list from stdin,\nand is able to find the email of a person::\n\n [setup]\n\n stdin = -file some-test-contacts.txt\n\n [act]\n\n my-contacts-program get-email-of --name 'Pablo Gauss'\n\n [assert]\n\n exit-code == 0\n\n stdout equals < exactly contacts.case\n PASS\n\n\n\"PASS\" means that all assertions were satisfied.\n\nThis test assumes that\n\n * the system under test - ``my-contacts-program`` - is is found in the same directory as the test case file\n * the file \"some-test-contacts.txt\" (that is referenced from the test case) is found in the same directory as the test case file\n\nThe ``home`` and ``act-home`` instructions\ncan be used to change the directories where Exactly looks for files referenced from the test case.\n\n\nTesting side effects on files and directories\n------------------------------------------------------------\n\nWhen the execution of a test case starts,\nthe current directory is set to a temporary directory.\nThis gives the test case a sandbox where it can create and manipulate files.\n\nThe sandbox - and all files within it - are removed when the execution ends.\n\n\nThe following tests a program that classifies\nfiles as either good or bad, by moving them to the\nappropriate directory::\n\n [setup]\n\n dir input\n dir output/good\n dir output/bad\n\n file input/a.txt = < exactly --act my-test.case\n a-dir\n a-file\n\n\nThe test case is executed in a temporary sandbox, as usual,\nbut assertions are ignored.\n\n\nTesting existing OS environment - tests without ``[act]``\n----------------------------------------------------------------------\n\nA test case does not need to have an ``[act]`` phase.\n\nFor example, to just check that the names of some SQL files are correct::\n\n [assert]\n\n def path SQL_DIR = -rel-here sql\n\n exists @[SQL_DIR]@ : type dir\n\n\n 'sql/ must only contain sql files'\n\n dir-contents @[SQL_DIR]@\n -selection ! name *.sql\n empty\n\n\nTesting a git commit hook\n------------------------------------------------------------\n\nThe following tests a git commit hook (`prepare-commit-msg`)::\n\n [setup]\n\n\n def program GET_LOG_MESSAGE_OF_LAST_COMMIT = % git log -1 --format=%s\n\n\n ## Setup a (non empty) git repo.\n\n $ git init\n\n file file-in-repo = \"A file in the repo\"\n\n $ git add file-in-repo\n\n $ git commit -m 'commit of file already in repo'\n\n\n ## Install the commit hook to test.\n\n copy prepare-commit-msg .git/hooks\n\n\n ## Setup a branch, with issue number in its name,\n # and a file to commit.\n\n $ git checkout -b \"AB-123-branch-with-issue-number\"\n\n file file-to-add = \"A file to add on the branch\"\n\n $ git add file-to-add\n\n\n [act]\n\n\n $ git commit -m \"commit message without issue number\"\n\n\n [assert]\n\n\n stdout -from\n @ GET_LOG_MESSAGE_OF_LAST_COMMIT\n equals\n <<-\n AB-123 : commit message without issue number\n -\n\n\nNote: Since a test is executed in a sandbox directory, it is ok\nto create the git repo in CWD.\n\nNote: Since the test is rather long, it would increase readability\nto put part of it in external files, and including them using `including`.\nE.g.::\n\n [setup]\n ...\n including repo-in-cwd-with-installed-commit-hook.setup\n\n\nORGANIZING TESTS\n========================================\n\nFile inclusion\n------------------------------------\n\nTest case contents can be included from external files::\n\n [setup]\n\n including my-dir-symbols.def\n\n including my-common-setup-and-cleanup.xly\n\n\n\nTest suites\n------------------------------------\n\n\nTests can be grouped in suites::\n\n\n first.case\n second.case\n\nor::\n\n [cases]\n\n helloworld.case\n *.case\n **/*.case\n\n\n [suites]\n\n sub-suite.suite\n *.suite\n pkg/suite.suite\n **/*.suite\n\n\n\nIf the file ``my-suite.suite`` contains this text, then Exactly can run it::\n\n > exactly suite my-suite.suite\n ...\n OK\n\n\nThe result of a suite can be reported as\nsimple progress information,\nor JUnit XML.\n\n\nSuites can contain test case functionality that is common\nto all cases in the suite. For example::\n\n\n [cases]\n\n *.case\n\n [conf]\n\n act-home = ../bin/\n\n [setup]\n\n def string CONF_FILE = my.conf\n\n file @[CONF_FILE]@ =\n <= 3.5.\n\nUse ``pip`` or ``pip3`` to install::\n\n > pip install exactly\n\nor::\n\n > pip3 install exactly\n\nThe program can also be run from a source distribution::\n\n > python3 src/default-main-program-runner.py\n\n\nDEVELOPMENT STATUS\n========================================\n\n\nCurrent version is fully functional, but some syntax and semantics is inconsistent:\n\n* Some instructions allow arguments to span multiple lines, some do not.\n* Most instructions interpret symbol references in arguments, some do not.\n* Support for escapes characters in strings is missing.\n\nIncompatible changes to syntax and semantics may occur in every release until v 1.0.\n\n\nComments are welcome!\n\n\nFuture development\n------------------------------------\n\nMore functionality is needed, smaller and larger.\nIncluding (but not limited to):\n\n* More string transformers, file matchers etc\n* Possibility to use \"program\" values in more places, e.g. in ``[act]``\n* Improved string character escaping\n* Remove setting of ``EXACTLY_...`` environment variables\n* Separate sets of environment variables for \"action to check\" and other processes\n* Possibility to set stdin for processes other than the \"action to check\"\n* file-matcher: Add matcher: ``dir-contents``\n* files-matcher: Add logical operators\n* ``dir-contents``: Check contents of directory recursively.\n* string-matcher: Add logical operators\n* Symbol substitution in files\n* Variables - corresponding to symbol definitions -\n but for variable values\n* Macros and functions\n* Ability to embed Python code in test cases\n* Python library for running cases and suites from within Python as a DSEL\n* Improve error messages\n\n\nAUTHOR\n========================================\n\n\nEmil Karl\u00e9n\n\nemil@member.fsf.org\n\n\nTHANKS\n========================================\n\n\nThe Python IDE\n`PyCharm\n`_\nfrom\n`JetBrains\n`_\nhas greatly helped the development of this software.\n\n\nDEDICATION\n========================================\n\n\nAron Karl\u00e9n\n\nTommy Karlsson\n\nG\u00f6tabergsgatan 10, l\u00e4genhet 4\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/emilkarlen/exactly/wiki", "keywords": "test case suite check assert script shell console command line program execute sandbox", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "exactly", "package_url": "https://pypi.org/project/exactly/", "platform": "", "project_url": "https://pypi.org/project/exactly/", "project_urls": { "Homepage": "https://github.com/emilkarlen/exactly/wiki" }, "release_url": "https://pypi.org/project/exactly/0.11.0.1/", "requires_dist": null, "requires_python": "", "summary": "Tests a command line program by executing it in a temporary sandbox directory and inspecting its result.", "version": "0.11.0.1" }, "last_serial": 5216425, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "76d31d6caac9535c6b92ca84801959ae", "sha256": "780b3b5d6b854db7d4560b3bb0fb37eb4906eef9629705b92e4ac1b046ccc1f7" }, "downloads": -1, "filename": "exactly-0.10.0-py3-none-any.whl", "has_sig": false, "md5_digest": "76d31d6caac9535c6b92ca84801959ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 744287, "upload_time": "2019-02-05T22:38:37", "url": "https://files.pythonhosted.org/packages/6d/a0/14cdce882e2333c5640b4f9e8ddca0a78cbd8319ff5dd57f76f4e94b08e5/exactly-0.10.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "25d83a143feadd181d7b65d2506f7502", "sha256": "78d89d48cd49f42b8de6feb22861311b0ccc6f1455785a9ae2280f748347ebc5" }, "downloads": -1, "filename": "exactly-0.10.0.tar.gz", "has_sig": false, "md5_digest": "25d83a143feadd181d7b65d2506f7502", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 470625, "upload_time": "2019-02-05T22:38:41", "url": "https://files.pythonhosted.org/packages/ad/a6/8ee7bfe15a11c2238bf91b26fc732c9729fe9399778abba9d65eb553aaa4/exactly-0.10.0.tar.gz" } ], "0.11.0.1": [ { "comment_text": "", "digests": { "md5": "bf4c5f57dd67eda96620195522024b25", "sha256": "129ccb8a0ab8499f2cbd095eddc1115eacc220c997c2185379368692ee0b5111" }, "downloads": -1, "filename": "exactly-0.11.0.1-py3.5.egg", "has_sig": false, "md5_digest": "bf4c5f57dd67eda96620195522024b25", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 2013574, "upload_time": "2019-05-02T10:39:03", "url": "https://files.pythonhosted.org/packages/9a/4c/c06a90d7967a64467710acd07072d2162dfec85a7ff16ba6cd11be3ef3d3/exactly-0.11.0.1-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "484d0e457e52d2527bdf2f6e2d8c5dba", "sha256": "eeecb9d5522438823c85a3feab2537eac961cf4f048e9bb6ca15ab3965c831c8" }, "downloads": -1, "filename": "exactly-0.11.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "484d0e457e52d2527bdf2f6e2d8c5dba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 751321, "upload_time": "2019-05-02T10:38:49", "url": "https://files.pythonhosted.org/packages/56/28/96740cc38003041d18feca96e2d4aed3f8b8b296d461d3e4f79706aaf62a/exactly-0.11.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1361a8655ddaf37389e32724214bd490", "sha256": "d66a3842ac4c4c5855b2dbaa4cb7489369b4abcd9d6dd01255c9a5a3fbaf8ad5" }, "downloads": -1, "filename": "exactly-0.11.0.1.tar.gz", "has_sig": false, "md5_digest": "1361a8655ddaf37389e32724214bd490", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 477841, "upload_time": "2019-05-02T10:39:06", "url": "https://files.pythonhosted.org/packages/2f/63/d3ba7842b9299f68d5167be855ec010c0c5ed615ca0bed77481a3decdd38/exactly-0.11.0.1.tar.gz" } ], "0.8.6.1": [ { "comment_text": "", "digests": { "md5": "6cd6115cc0ae24f40312561f4d31027e", "sha256": "0159eb2e4cc79c05228cf89abc150c82d0eab1578c74d52dc65e2d48eb1949bd" }, "downloads": -1, "filename": "exactly-0.8.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6cd6115cc0ae24f40312561f4d31027e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 566476, "upload_time": "2017-12-04T23:03:30", "url": "https://files.pythonhosted.org/packages/0c/49/b78c53db127ebac3b15de7fdb8c6c09df33a6c7fb91841907fb61f579480/exactly-0.8.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a402c07b71c4ede8a1b8beec5fb78e6e", "sha256": "d3d8afc1d7983e45cc3b9ac58b7d9b7afb3835c09811b838bb517360c4240678" }, "downloads": -1, "filename": "exactly-0.8.6.1.tar.gz", "has_sig": false, "md5_digest": "a402c07b71c4ede8a1b8beec5fb78e6e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 344658, "upload_time": "2017-12-04T23:03:32", "url": "https://files.pythonhosted.org/packages/23/2d/f43b517663d653c19a83a011a496b74966ef6e3bffbfe5324b8017c6a366/exactly-0.8.6.1.tar.gz" } ], "0.8.6.2": [ { "comment_text": "", "digests": { "md5": "090c691ee8a34eadba7cd4f5fbb2a16a", "sha256": "653180469abe459417b8c41dfc2c5ea5ccb64cf24024c9de2ab8683436c749d4" }, "downloads": -1, "filename": "exactly-0.8.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "090c691ee8a34eadba7cd4f5fbb2a16a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 575410, "upload_time": "2017-12-26T15:53:29", "url": "https://files.pythonhosted.org/packages/f1/87/c0300d11102986bfd4847c4dcd4a306a6a18cdbccd2d0ab2b1cda578261b/exactly-0.8.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a53deeb513c26be8b7c28e56bb3f7d49", "sha256": "d441d82b9dfc742bf6f30b5e3e3197cc69aabbf5ce8575f60c80e7a65ade08c4" }, "downloads": -1, "filename": "exactly-0.8.6.2.tar.gz", "has_sig": false, "md5_digest": "a53deeb513c26be8b7c28e56bb3f7d49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 361259, "upload_time": "2017-12-26T15:53:32", "url": "https://files.pythonhosted.org/packages/53/ba/00d294ced40785fa710efb75c9b307be76dd77419d7ad4f5b2cb1033f6f2/exactly-0.8.6.2.tar.gz" } ], "0.8.7": [ { "comment_text": "", "digests": { "md5": "80dbf37b4102e889eac026c182e9c030", "sha256": "c42fce9a0d1fb901632a67b6056b7d68e53bc65df92244506d2e5dd5be6655f9" }, "downloads": -1, "filename": "exactly-0.8.7-py3-none-any.whl", "has_sig": false, "md5_digest": "80dbf37b4102e889eac026c182e9c030", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 584342, "upload_time": "2018-03-15T15:25:54", "url": "https://files.pythonhosted.org/packages/f9/af/32d85fe207bd4413cab8f0094e445d8402a4448c466ad13325c901ecaf72/exactly-0.8.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f4a3fc4275049d879be97705c2bea27b", "sha256": "d2eb067b6302d48bf1126d8e296276a57f0d8eb19ca1d25a8142f03ae6509b2f" }, "downloads": -1, "filename": "exactly-0.8.7.tar.gz", "has_sig": false, "md5_digest": "f4a3fc4275049d879be97705c2bea27b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 375226, "upload_time": "2018-03-15T15:26:04", "url": "https://files.pythonhosted.org/packages/b7/1c/09be4c6b37665c5a8b1149f1eacf3d8ac63177d51c2d715ff1ffed23ae46/exactly-0.8.7.tar.gz" } ], "0.8.7.1": [ { "comment_text": "", "digests": { "md5": "07c8e15f94f81a14cf2bf4bdcebc361b", "sha256": "78a3c0e19b8783e48388cad537c6caabaaa3d973bfa43ac637849ec915686716" }, "downloads": -1, "filename": "exactly-0.8.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "07c8e15f94f81a14cf2bf4bdcebc361b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 584748, "upload_time": "2018-03-19T01:05:12", "url": "https://files.pythonhosted.org/packages/d5/8e/8d0033bd89ab4c1fab5847a249c9a57b1920ba0070fbc9919a23333fce15/exactly-0.8.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae48b472b0cbd9620c9abaa0c7eac5d8", "sha256": "d253542f0179e63c81c9db5969f60a47d0eda91ed1070dbb61e076037faf6805" }, "downloads": -1, "filename": "exactly-0.8.7.1.tar.gz", "has_sig": false, "md5_digest": "ae48b472b0cbd9620c9abaa0c7eac5d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 376266, "upload_time": "2018-03-19T01:05:16", "url": "https://files.pythonhosted.org/packages/03/b1/a67954a002e39904c677f329a26f91be554fc2643fccda99b93aa13f50d9/exactly-0.8.7.1.tar.gz" } ], "0.8.8": [ { "comment_text": "", "digests": { "md5": "a3ce4cb6911b27af7a8458bea78fc58c", "sha256": "6b93f0c43d3e2c539443b50bc072b7ae7a3abb4da513fdb2a7c7a6dc18c28dfd" }, "downloads": -1, "filename": "exactly-0.8.8-py3.6.egg", "has_sig": false, "md5_digest": "a3ce4cb6911b27af7a8458bea78fc58c", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 1638667, "upload_time": "2018-04-08T20:28:05", "url": "https://files.pythonhosted.org/packages/05/cf/b4cfa0ca2ec6ca3f84a694c9f0ff79538fba80549cf5c75e35f168a0cd29/exactly-0.8.8-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "27c05636690c034b1db88c74c6d04064", "sha256": "57b83c9700094788ccb16be53df9b98072b6a48187eb9590fd9a4597f49286f5" }, "downloads": -1, "filename": "exactly-0.8.8-py3-none-any.whl", "has_sig": false, "md5_digest": "27c05636690c034b1db88c74c6d04064", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 623902, "upload_time": "2018-04-08T20:28:01", "url": "https://files.pythonhosted.org/packages/4e/47/70da89e092c69afb1f1c99cd0aecf88c66f8c2d09c848ce114b658512ce5/exactly-0.8.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "84dfb570534229703642d303cbb02cb7", "sha256": "fd2898cfc89f1e0980f1855a731e4414f716774cbd89e06b0f477efcfe567f39" }, "downloads": -1, "filename": "exactly-0.8.8.tar.gz", "has_sig": false, "md5_digest": "84dfb570534229703642d303cbb02cb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 397088, "upload_time": "2018-04-08T20:28:07", "url": "https://files.pythonhosted.org/packages/f2/e6/734b799ce5dee2e0e1fac45ce0fae5fa3508e262f652cc2972e55bfba390/exactly-0.8.8.tar.gz" } ], "0.8.8.2": [ { "comment_text": "", "digests": { "md5": "c81df35f0cdeab65dc9b9227e95fc1f5", "sha256": "0b2e73acf4f3df0278fbfed07d7ece97979642cd41278b875c7059a7cbbc8d18" }, "downloads": -1, "filename": "exactly-0.8.8.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c81df35f0cdeab65dc9b9227e95fc1f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 623999, "upload_time": "2018-04-10T00:00:16", "url": "https://files.pythonhosted.org/packages/e3/76/e55fb411b450eb5bcc15aad8b60872069c2c36ed8de6bd34dba8e21f6923/exactly-0.8.8.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c3f585140085f09adb708d3767a68c7", "sha256": "ceaaf033c0dad7610f569bf8d7e85bc97f510c6c24de88ffb50da277a531a034" }, "downloads": -1, "filename": "exactly-0.8.8.2.tar.gz", "has_sig": false, "md5_digest": "2c3f585140085f09adb708d3767a68c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 398239, "upload_time": "2018-04-10T00:00:18", "url": "https://files.pythonhosted.org/packages/24/5e/a1b7dece8c6e996564e0338a53967300ef0988486149f4db1934c0689de4/exactly-0.8.8.2.tar.gz" } ], "0.8.9": [ { "comment_text": "", "digests": { "md5": "629e8304d21d8299951f8ae46a4d245b", "sha256": "12b5a72c0496972d84abda2d62cdb00119b241303080d5d56e2b2288743c730b" }, "downloads": -1, "filename": "exactly-0.8.9-py3-none-any.whl", "has_sig": false, "md5_digest": "629e8304d21d8299951f8ae46a4d245b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 629121, "upload_time": "2018-04-15T20:59:23", "url": "https://files.pythonhosted.org/packages/98/aa/6ae7a05ae79f1f129626ba57133c34ffb0c9c9687bacd5854b072acc6dff/exactly-0.8.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4f24944e8ea419b12f3ccd8e25828428", "sha256": "4aa6b2ff3eb0b36e836885cf71e267e328c2267abe2600d6604b8dbe74fd24c2" }, "downloads": -1, "filename": "exactly-0.8.9.tar.gz", "has_sig": false, "md5_digest": "4f24944e8ea419b12f3ccd8e25828428", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 399788, "upload_time": "2018-04-15T20:59:26", "url": "https://files.pythonhosted.org/packages/97/29/61c931cacda62e85af354c3670ee342cb5fdb00321d87ece679bdff2f9ea/exactly-0.8.9.tar.gz" } ], "0.8.9.1": [ { "comment_text": "", "digests": { "md5": "46325f6a435fbceeeb19f421e788385b", "sha256": "1d3d22362b11d279f65d970c33127a102c2d3c3451d55579d205afcc97117af5" }, "downloads": -1, "filename": "exactly-0.8.9.1-py3.5.egg", "has_sig": false, "md5_digest": "46325f6a435fbceeeb19f421e788385b", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 1684983, "upload_time": "2018-05-12T04:40:18", "url": "https://files.pythonhosted.org/packages/0e/72/dca72c29a5ba57c0d8356505bf0e7abdced0e58ae5b882e411fbccc6e0a6/exactly-0.8.9.1-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "eb8636d9d2bf7c47e6cdc06a88303f13", "sha256": "104c3b04bc077febda330e9172b414c1890b3e740723095c978b27ab7f653cae" }, "downloads": -1, "filename": "exactly-0.8.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "eb8636d9d2bf7c47e6cdc06a88303f13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 630344, "upload_time": "2018-05-12T04:40:12", "url": "https://files.pythonhosted.org/packages/30/72/4e84a1e2f0082a7691af9c88b368081a60938b05b7a42a7c58abe9b6ac56/exactly-0.8.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d484371ef03b1af3a946cf384d6d3fe3", "sha256": "00b11f4bb09534ce74c44da37eff4d6135d05aac21154681dfb5076c2024b7c7" }, "downloads": -1, "filename": "exactly-0.8.9.1.tar.gz", "has_sig": false, "md5_digest": "d484371ef03b1af3a946cf384d6d3fe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 401241, "upload_time": "2018-05-12T04:40:20", "url": "https://files.pythonhosted.org/packages/3c/f9/926c508f23df32452b95250e345e5899e491ec4b7b6ca8849bcd7597aba0/exactly-0.8.9.1.tar.gz" } ], "0.8.9.2": [ { "comment_text": "", "digests": { "md5": "874a6f1aa15757205090dc4beb62d14f", "sha256": "2363146c75237292a4ae8f9deebb4e98bfa264b29ead46850c4a184412740ac1" }, "downloads": -1, "filename": "exactly-0.8.9.2-py3-none-any.whl", "has_sig": false, "md5_digest": "874a6f1aa15757205090dc4beb62d14f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 639106, "upload_time": "2018-06-24T20:51:23", "url": "https://files.pythonhosted.org/packages/ec/50/37baaa305c4e3036e8f48ca19466e1ba741b9cb168068dfbe6f9628d53e5/exactly-0.8.9.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "73ff18e7811a2908e5ef6e3aa8655688", "sha256": "1ff8bc8712dbe884743adf59ff7dea31601600116d3a365ef36fa74acce0292e" }, "downloads": -1, "filename": "exactly-0.8.9.2.tar.gz", "has_sig": false, "md5_digest": "73ff18e7811a2908e5ef6e3aa8655688", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 408169, "upload_time": "2018-06-24T20:51:27", "url": "https://files.pythonhosted.org/packages/a1/43/0d92ed992194a13b5287dd5665b55e28963c3c69d733fad0e6009d532133/exactly-0.8.9.2.tar.gz" } ], "0.8.9.4": [ { "comment_text": "", "digests": { "md5": "598a007a0616ff7f073ef4a9f3e688ba", "sha256": "f7089effbf5217a4081265eda61735d003b28d8ad2c026b9edd636fa896b64b2" }, "downloads": -1, "filename": "exactly-0.8.9.4-py3.5.egg", "has_sig": false, "md5_digest": "598a007a0616ff7f073ef4a9f3e688ba", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 1731637, "upload_time": "2018-08-08T04:04:39", "url": "https://files.pythonhosted.org/packages/7f/b2/57daf771d2b7bbb4516eb0a799d9706b342130f62dda2b26a1d05b5d2294/exactly-0.8.9.4-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "daa9b3364a2baeca6cb5a430c251a3c8", "sha256": "a4392c2dd4c84487bd42ef1a5a34d33b5141cbe88a3981186995b7d838c35195" }, "downloads": -1, "filename": "exactly-0.8.9.4-py3-none-any.whl", "has_sig": false, "md5_digest": "daa9b3364a2baeca6cb5a430c251a3c8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 648038, "upload_time": "2018-08-08T04:04:35", "url": "https://files.pythonhosted.org/packages/5f/ea/9b513a732d3af3e405281ffc10694ef83d2dcff8669668bf74d5067f873a/exactly-0.8.9.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a821b1877269f5a9f20ddbee526d38df", "sha256": "c4db617212aaec305fc6627b4f18bb98b97288e2f31cab3abcc81660931f4b91" }, "downloads": -1, "filename": "exactly-0.8.9.4.tar.gz", "has_sig": false, "md5_digest": "a821b1877269f5a9f20ddbee526d38df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 415862, "upload_time": "2018-08-08T04:04:42", "url": "https://files.pythonhosted.org/packages/62/e7/410fe71272dedd5e32ab05881bc69cc844d45b8ac482bf0810569daa5e9c/exactly-0.8.9.4.tar.gz" } ], "0.8.9.5": [ { "comment_text": "", "digests": { "md5": "4321f46159563ced1ec75324460f2451", "sha256": "6639e65a32b76ce21a6e4cb6f28719d3b48b57661f566e8daf2018c4b6a37d7a" }, "downloads": -1, "filename": "exactly-0.8.9.5-py3-none-any.whl", "has_sig": false, "md5_digest": "4321f46159563ced1ec75324460f2451", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 679732, "upload_time": "2018-10-06T14:46:56", "url": "https://files.pythonhosted.org/packages/39/6e/cd52ea0d1b2e688d65582a82aab4188fad0a45416fdf81d48f4ee3c4ec0a/exactly-0.8.9.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e0315d4d88087656d78bc0a2c310f904", "sha256": "c9f42887d88eb1e3f1a12e892359970db50337132d702e64b0e196ae4bffb2f0" }, "downloads": -1, "filename": "exactly-0.8.9.5.tar.gz", "has_sig": false, "md5_digest": "e0315d4d88087656d78bc0a2c310f904", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 439417, "upload_time": "2018-10-06T14:46:58", "url": "https://files.pythonhosted.org/packages/e7/38/21400619dad7d51d80bd99e60aaff33580b3a32c3e8b5e1bbf862e5b15ec/exactly-0.8.9.5.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "f7b07bd226007be100ab0c32c4192897", "sha256": "dfe3d86fdff0768d4da77a9dfbf16b76ab34e6916cc41dc327e063b843f78e72" }, "downloads": -1, "filename": "exactly-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f7b07bd226007be100ab0c32c4192897", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 724508, "upload_time": "2019-01-17T18:42:39", "url": "https://files.pythonhosted.org/packages/7f/2c/5c6c9a8f0a839335dace4cde1c24455f4403040a27a887e7dad4eb4b6b7b/exactly-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6ab3402d152eaa94cefe65c6039c5674", "sha256": "8c92f39ce4c7c5603cadee768c6b58f9f4d236a306e0e381b3fd75e51814758d" }, "downloads": -1, "filename": "exactly-0.9.1.tar.gz", "has_sig": false, "md5_digest": "6ab3402d152eaa94cefe65c6039c5674", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 461092, "upload_time": "2019-01-17T18:42:42", "url": "https://files.pythonhosted.org/packages/0c/f8/68e90332f70a855567150d13ca3b92e25729c22a5f67fd8ec2703b862b84/exactly-0.9.1.tar.gz" } ], "0.9.1.1": [ { "comment_text": "", "digests": { "md5": "4f54dc938bc749c917bcea5af7a6d95c", "sha256": "ba548f4ef4e3e3a3ef8a5687b7a0ab0a0cbe3ca5c72dc1f63f45077843657c0f" }, "downloads": -1, "filename": "exactly-0.9.1.1-py3.6.egg", "has_sig": false, "md5_digest": "4f54dc938bc749c917bcea5af7a6d95c", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 1905181, "upload_time": "2019-01-26T22:40:26", "url": "https://files.pythonhosted.org/packages/74/44/c14323812062ef690b9fbda1aef9b67e32bc95f66985c11ad0d4f2bc343c/exactly-0.9.1.1-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "e6c04fc27a4721ee71a711bedf9df372", "sha256": "04b1d8b2aca13688a4ac5deaebca96745ee072e73a9509664a813f8d3991d362" }, "downloads": -1, "filename": "exactly-0.9.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e6c04fc27a4721ee71a711bedf9df372", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 723921, "upload_time": "2019-01-26T22:40:20", "url": "https://files.pythonhosted.org/packages/1c/e6/2dbafa09b2f39d830ee0f22580eeb02f7d3482832d4ffc4ad42f44738e97/exactly-0.9.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a98967e14d162763bcfc1eed8b9268fd", "sha256": "43dfd66a8571bea473acaa75ebdef9db1d8ff8ee22194a3bfb603a54e720a668" }, "downloads": -1, "filename": "exactly-0.9.1.1.tar.gz", "has_sig": false, "md5_digest": "a98967e14d162763bcfc1eed8b9268fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 462412, "upload_time": "2019-01-26T22:40:29", "url": "https://files.pythonhosted.org/packages/a3/ea/dce43fd0896c6b8a78a00377f2a8dbdce4a54a84cb338c09390e4f4250cd/exactly-0.9.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bf4c5f57dd67eda96620195522024b25", "sha256": "129ccb8a0ab8499f2cbd095eddc1115eacc220c997c2185379368692ee0b5111" }, "downloads": -1, "filename": "exactly-0.11.0.1-py3.5.egg", "has_sig": false, "md5_digest": "bf4c5f57dd67eda96620195522024b25", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 2013574, "upload_time": "2019-05-02T10:39:03", "url": "https://files.pythonhosted.org/packages/9a/4c/c06a90d7967a64467710acd07072d2162dfec85a7ff16ba6cd11be3ef3d3/exactly-0.11.0.1-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "484d0e457e52d2527bdf2f6e2d8c5dba", "sha256": "eeecb9d5522438823c85a3feab2537eac961cf4f048e9bb6ca15ab3965c831c8" }, "downloads": -1, "filename": "exactly-0.11.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "484d0e457e52d2527bdf2f6e2d8c5dba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 751321, "upload_time": "2019-05-02T10:38:49", "url": "https://files.pythonhosted.org/packages/56/28/96740cc38003041d18feca96e2d4aed3f8b8b296d461d3e4f79706aaf62a/exactly-0.11.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1361a8655ddaf37389e32724214bd490", "sha256": "d66a3842ac4c4c5855b2dbaa4cb7489369b4abcd9d6dd01255c9a5a3fbaf8ad5" }, "downloads": -1, "filename": "exactly-0.11.0.1.tar.gz", "has_sig": false, "md5_digest": "1361a8655ddaf37389e32724214bd490", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 477841, "upload_time": "2019-05-02T10:39:06", "url": "https://files.pythonhosted.org/packages/2f/63/d3ba7842b9299f68d5167be855ec010c0c5ed615ca0bed77481a3decdd38/exactly-0.11.0.1.tar.gz" } ] }