{ "info": { "author": "Steven LI", "author_email": "steven004@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: Unix", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Testing", "Topic :: System :: Logging", "Topic :: Utilities" ], "description": "Test Steps functions for each assertion and automatic logging\n=============================================================\n\nThe package test_steps is to implement a bunch of functions about test checks and logging.\nThe purpose is to simplify the assertion and automatically logging the checks,\nwhich are not supported in most of the current python test frames.\n\nAll the checks and logging functions can be used independently, or be used in test frameworks\nas py.test or nose\n\n\nMagics in source code\n---------------------\n\nTo make is extensible and more flexible, meta-programming and functional programming technologies\nare used in this package. It makes the source is thus likely not something for Python beginners.\nHowever, you are welcome if you want to study meta-programming or functional programming, and\nyour comments are always appreciated\n\n\nInstall test_steps\n------------------\n\n::\n\n pip install test_steps\n\n\nLessons with examples\n---------------------\n\nlesson 1 - the basic auto-log boolean functions:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson1_autolog.py\n\nlesson 2 - the check function with auto-log string:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson2_check.py\n\nlesson 3 - the check functions with options:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson3_options.py\n\nlesson 4 - the checks functions - another format for multiple check(s):\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson4_checks.py\n\nlesson 5 - get return from check and checks function:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson5_return.py\n\nlesson 6 - function auto-detection mechanism (pytest/nose users can skip this, use plugin instead):\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson6_func_auto_check.py\n\nlesson 7 - return value setting as case pass (0 or None is considerred as pass by default:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson7_returnvalue.py\n\nlesson 8 - yaml test bed initialization support:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson8_yaml_testbed.py\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson8_yaml_testbed2.py\n\nlesson 9 - python format test bed initialization support:\nhttps://github.com/steven004/TestSteps/blob/master/test_examples/test_lesson9_pytestbed.py\n\n\npytest-autochecklog/nose-autochecklog plugin\n--------------------------------------------\n\nFor pytest or nosetests user, you can use the pytest-autochecklog or nose-autochecklog plugin\nto use test_steps module. The pytest-autochecklog or nose-autochecklog plugin\nhas better auto-func-detection mechanism.\n\nGet it from: https://pypi.python.org/pypi?:action=display&name=pytest-autochecklog\n\nor: https://pypi.python.org/pypi?:action=display&name=nose-autochecklog\n\n\n\nExample for using simple-step functions\n---------------------------------------\n\n.. code-block:: python\n\n from test_steps import *\n def test_example()\n ok(\"just pass the check and log it\")\n #fail(\"Just fail the check and log it\")\n ok(3+2 == 5, \"pass if expr else fail\")\n #eq(\"Shanghai\", \"Beijing\", \"Shanghai not equal to Beijing\")\n eq(4+5, 9)\n ne(\"Shanghai\", \"Beijing\", \"Pass, Shanghai not equal to Beijing\")\n #'Shanghai City' contains 'Country', the second parameter could be regex\n match(\"Shanghai City\", \"Country\")\n unmatch(\"Shanghai City\", \"Country\", \"Pass, not contains, regex can be used too\")\n\nMore functions: lt, gt, more operators/functions can be added, see the section:\nadd more operators/check functions via 3 steps\n\n\nLogging of the steps\n--------------------\nIf the log_level is set to INFO, and you added the data-time format to it,\nthe logging of the execution of test_example() case would be like::\n\n 2015-01-10 20:43:22,787 - INFO - ------------------------------------------------------\n 2015-01-10 20:43:22,788 - INFO - Func test_example in file: /Users/Steven004/test/demo.py\n 2015-01-10 20:43:22,788 - INFO - Check-1: just pass the check and log it - PASS:\n 2015-01-10 20:43:26,789 - INFO - Check-2: pass if expr else fail - PASS:\n 2015-01-10 20:43:26,789 - INFO - Check-3: 9 == 9 - PASS:\n 2015-01-10 20:43:26,789 - INFO - Check-4: Pass, Shanghai not equal to Beijing - PASS:\n 2015-01-10 20:43:29,792 - ERROR - Check-5: \"Shanghai City\" =~ \"Country\" - FAIL: \"Shanghai City\" =~ \"Country\"?\n\n\nThe log-level can be setting, and logging handler can be set by the user, as all you\ncan do for standard logging.\nIf a check function is in a loop, there will be multiple checks logged.\n\n\nAdvanced check functions\n------------------------\n\nTo simplify the testing,\n\n.. code-block:: python\n\n check(code_string, globals=globals(), locals=locals(), **kwargs)\n checks(multiple_checks_code_string_with_options, globals=globals(), locals=locals())\n # s is an alias of checks, step=check, s=steps=checks\n\nThe check function is to execute the code string in the particular name spaces, with some options\nto provide some advanced feature. The code string will be recorded for the check if desc is None.\nThe checks function is for writing multiple checks in a simpler format.\n\nSupported optional args in check::\n\n - timeout: e.g. timeout=30, fail if the step could not complete in 30 seconds\n - repeat: e.g. repeat=20, repeat in another second if fail until pass, timeout in 20s\n - duration: e.g. duration=15, stay in this step for 15 seconds, even it completed shortly\n - xfail: e.g. xfail=True, expected failure, report pass when fail, vice versa\n - warning: e.g. warning=True, Pass the step anyway, but log a warning message if the condition is not met\n - skip: e.g. skip=True, just skip this case.\n - exception: e.g. exception=NameError, expected exception will be raised. pass if so, or fail\n - passdesc: e.g. passdesc=\"the string to log if passed\" (replace the code_string in the log)\n - faildesc: e.g. faildesc=\"the string to log if failed\" (replace the code_string in the log)\n\nPlease be noticed that for any step fails, the test will be terminated (in py.test or other test framework,\nthe current case will be terminated), unless you set *warning* option for it.\n\n\nExamples:\n\n.. code-block:: python\n\n # Just as match(string1.range(1..4), r'\\w\\-\\w') function\n check(\"match(string1.range(1..4), r'\\w\\-\\w')\")\n # Run the code string; pass if it return in 15 seconds, or fail with timeout exception\n check(\"num_async.data_sync()\", timeout = 15)\n # repeat option. In 20 seconds, if the expr returns False, re-run it every another second,\n # until it returns True (which means pass), or time is out (which means fail)\n check(\"num_async.get_value() == 500\", repeat = 20, xfail = True)\n # Run code_string in a particular name space, here, to run code string in shanghai object's name space\n check(\"cars.averagespeed() > 50 \", globals = shanghai.__dict__)\n check(\"1/0\", exception=ZeroDivisionError, passdesc='Pass, expected to have the ZeroDivisionError')\n\n\nNot as the other check functions (eq, ne, ...), the check/checks functions just use operator to\nwrite the checks in a string. The mapping of operators and check functions::\n\n == : eq != : ne > : gt < : lt >= : ge <= : le\n =~ : match !~ : unmatch =>: has !> hasnt\n\n\n*checks* is another way to write checks in one statement. When the function checks (or s) is used,\nthe format is a little bit different. It uses command-arguments-like format. And you can set the\nname spaces in one shot for all the checks in the code string.\nThe following code has the same function as the 3 first 3 steps in the code above\n\n.. code-block:: python\n\n checks('''\n string1.range(1..4) =~ r'\\w\\-\\w'\n num_async.data_sync() -t 15\n num_async.get_value() == 500 -r 20 -x\n ''')\n\nOptions in checks(or s) ::\n\n -t 30 or --timeout 30 in checks() means timeout=30 in check()\n -r 10 or --repeat 10 in checks() means repeat=10\n -d 10 or --duration 10 means duration=10\n -x or --xfail or -x True or --xfail True means xfail=True\n -w or --warning or -w True or --warning True means warning=True\n -s or --skip or -s True or --skip True means skip=True\n -e MyException means exception=MyException\n -p pass_str or --passdesc pass_str means passdesc=pass_str\n -f fail_str or --faildesc fail_str means faildesc=fail_str\n\n\nAdd more operators/check functions via 3 steps\n----------------------------------------------\nFor different product, or scenarios, some other operation you may want to define and add them\nfor logging, it's easy based on this framework.\n\n1. Define a comparing function for two expressions, e.g., to compare to date string\n\n.. code-block:: python\n\n ## compDate('1/4/2015', '01-04-2015') return True\n def compDate(date1, date2):\n import re\n pattern = re.compile(r'(\\d+).(\\d+).(\\d+)')\n match1 = pattern.match(date1)\n match2 = pattern.match(date2)\n day1, month1, year1 = (int(i) for i in match1.group(1,2,3))\n day2, month2, year2 = (int(i) for i in match2.group(1,2,3))\n return (year1==year2) and (month1==month2) and (day1==day2)\n\n\n2. Register it into the test_steps framework:\n\n.. code-block:: python\n\n # bind the compDate function with '=d=' operator\n # After this step, you can directly use the operator in step/steps/s functions\n addBiOperator('=d=', compDate)\n\n3. Get the opWapperFunction\n\n.. code-block:: python\n\n sameDate = getOpWrapper('=d=')\n\nNow, everything is good, you can write the following steps in your scripts now, and\neverything will be auto logged.\n\n.. code-block:: python\n\n sameDate(\"01/03/2015\", \"1-3-2015\", \"description: this step should pass\")\n check(\" '03/05/2014' =d= '3/5/2014' \")\n\n\nCurrently, just binary operators are supported.\n\n\nTest Bed initialization (Environment Variable: TESTSUITE_CONFIG_PATH)\n---------------------------------------------------------------------\n\nThis feature is to improve test scripts portabiity. When we write scripts, we'd like to separate\ntest bed description and code into separated files. One test suite could run on different test beds.\nThis feature support an environment variable *TESTSUITE_CONFIG_PATH*, which indicate where the test bed\ndescription file is located. Two kinds of format of test beds are supported: .py or .yaml\n\nExamples:\n\n.. code-block:: python\n\n # Initiate a test bed which is indicated as a absolute path\n # Initiated test bed will be return as a module\n tb_m = init_testbed(\"/Users/xili4/PycharmProjects/TestSteps/test_examples/lesson8_testbed_obj.yaml\")\n\n # Initiated a test bed which is in the path TESTSUITE_CONFIG_PATH indicated\n # or get it from the scripts path if no TESTSUITE_CONFIG_PATH defined\n tb_m = init_testbed('test_lesson8_yaml_testbed2.yaml')\n\n # Initiated a test bed which has the same base name of the scripts file, but using yaml as extended name\n tb_m = init_testbed()\n\n # Initiate a .py test bed described in the path TESTSUITE_CONFIG_PATH indicated\n # or in the scripts located path\n tb_m = init_testbed('lesson9_pytestbed_config.py')\n\n\nlogging setting (Environment Variable: TESTSTEP_LOG_PATH)\n---------------------------------------------------------\n\nThe default logger test_logger is a Python logging instance, from the code like:\n\n.. code-block:: python\n\n test_logger = logging.getLogger(\"Test\").\n\nYou can directly use it to write logs, such as:\n\n.. code-block:: python\n\n test_logger.info(\"This will be write in to the /tmp/test_log/mm-dd-yyyy.log file\")\n test_logger.debug(\"debug information\")\n\nBy default, log level is WARNING, and the log will be outputted to standard output automatically. If\n*TESTSTEP_LOG_PATH* environment variable is defined. The log will be outputted to the defined directory\ntoo with a time stamp each time when running a test. For example, when you defined\n\n.. code-block::\n\n #export TESTSTEP_LOG_PATH='/home/steven004/test'\n\n\nAnd the directory does actually exist, you will find the test logs in that directory /home/steven004/test/\nanytime you run a test.\n\n\nYou can change the default test_logger or combine with another one using the setlogger method:\n\n.. code-block:: python\n\n setlogger(your_logger)\n # your_logger could be a logging object, or any object which support methods like info, error, ...\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/steven004/TestSteps", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "test_steps", "package_url": "https://pypi.org/project/test_steps/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/test_steps/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/steven004/TestSteps" }, "release_url": "https://pypi.org/project/test_steps/0.9.7/", "requires_dist": null, "requires_python": null, "summary": "Simple way to run test steps and automatic logging", "version": "0.9.7" }, "last_serial": 2961402, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "c1dd4ee09174a200b9ea13895279a018", "sha256": "a29797b0bcbfc94445a4e670b14345a4a038e8db5f231085a7a4f9020f2929eb" }, "downloads": -1, "filename": "test_steps-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c1dd4ee09174a200b9ea13895279a018", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8517, "upload_time": "2015-01-10T12:36:31", "url": "https://files.pythonhosted.org/packages/13/1e/688436d903caa87fdb290c909ca7663ff000933f8f773dc7e964920fd180/test_steps-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b8d4811390315ae21754562e2c4b82ea", "sha256": "8050d9d1434697402260fcd191c894c0b8f04e7917fbfec35fcd7972363116af" }, "downloads": -1, "filename": "test_steps-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b8d4811390315ae21754562e2c4b82ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9813, "upload_time": "2015-01-13T12:55:56", "url": "https://files.pythonhosted.org/packages/f4/e0/cd8cd8c56e7e47aa47c3f3453939699e36a372b41d30c4dea6bfe2e4bf6e/test_steps-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "bf8d2ca4cb3201f407f95478e12907e4", "sha256": "550d429cc9b9ff070ce6c000fae38820831952f44d633704cb75012062dee974" }, "downloads": -1, "filename": "test_steps-0.3.0.tar.gz", "has_sig": false, "md5_digest": "bf8d2ca4cb3201f407f95478e12907e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10778, "upload_time": "2015-01-15T13:23:12", "url": "https://files.pythonhosted.org/packages/1e/ba/b7825de4612c1e39b4cdced2a69edb883a3e028a44969140bee754e78d81/test_steps-0.3.0.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "52f6126d9d7b0a564514da6d51b0dec1", "sha256": "00bd4d16ea11a5ed3ddb88ee68b23f0ac4838db0f7406a9c6e863b5d429e0080" }, "downloads": -1, "filename": "test_steps-0.3.3.tar.gz", "has_sig": false, "md5_digest": "52f6126d9d7b0a564514da6d51b0dec1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11149, "upload_time": "2015-01-15T13:39:24", "url": "https://files.pythonhosted.org/packages/13/8e/d995d35dffd048ebb5526bfe85654640384e9e3241c6d451eb86d99b9aa0/test_steps-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "010c8ec53c428e6fff1536fcd6a03602", "sha256": "af2071a4b0d559a7cfc151156fdbaf0f5b357af809a757e809576e81ce35b88b" }, "downloads": -1, "filename": "test_steps-0.3.4.tar.gz", "has_sig": false, "md5_digest": "010c8ec53c428e6fff1536fcd6a03602", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11063, "upload_time": "2015-01-15T13:46:35", "url": "https://files.pythonhosted.org/packages/3d/ca/5b9c3e6f87e6e4fd71484c80e00a2be08023db60a4d8da162ffdfaea63e8/test_steps-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "2e9fdf5c79c7bcf0cd57e4762e84071a", "sha256": "d6da7a31a672fb219563b8b196c144209af68d36351f1b9affc8dbee5ddc11fe" }, "downloads": -1, "filename": "test_steps-0.3.5.tar.gz", "has_sig": false, "md5_digest": "2e9fdf5c79c7bcf0cd57e4762e84071a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11062, "upload_time": "2015-01-15T13:50:21", "url": "https://files.pythonhosted.org/packages/95/0c/19e01080ead00d72c95656732310682af7e5ddc4387d08edf7baed430c21/test_steps-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "a8fc3d5b52401c0c85b75a22afbbf348", "sha256": "45e63e2c4208d04c4874b0e88fa25eaf9a803a911b113b4164d5001760145939" }, "downloads": -1, "filename": "test_steps-0.3.6.tar.gz", "has_sig": false, "md5_digest": "a8fc3d5b52401c0c85b75a22afbbf348", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11170, "upload_time": "2015-01-15T14:06:12", "url": "https://files.pythonhosted.org/packages/a9/da/6d686743ec5cba16766185bab86b9cd666872aee606527ab7bbe785d29e7/test_steps-0.3.6.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "2223a63e82ccdcc3e26b249ca798ea25", "sha256": "6bbee41bf0fcd1acd328454872652995b16e4864c2200c00604ce19b27c34a5b" }, "downloads": -1, "filename": "test_steps-0.4.0.tar.gz", "has_sig": false, "md5_digest": "2223a63e82ccdcc3e26b249ca798ea25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11397, "upload_time": "2015-01-16T13:32:45", "url": "https://files.pythonhosted.org/packages/6c/4a/789e40168a851e7398d6264ec17fe16b651a30a8ebb61ab21a81e1dd8e8d/test_steps-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "8549742e994b225c18835750ef5fa1d8", "sha256": "8f3f62863d53f00f8dea6e53f5933e026d293efc27143d581a5f310a680c465c" }, "downloads": -1, "filename": "test_steps-0.4.1.tar.gz", "has_sig": false, "md5_digest": "8549742e994b225c18835750ef5fa1d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11418, "upload_time": "2015-01-19T13:21:33", "url": "https://files.pythonhosted.org/packages/5d/6b/37e06c8ae5ad7e22dbbb98a84168b687f5a7906680cf0b99298dbea02e77/test_steps-0.4.1.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "898febfaeefb79f0043fe580a94f4c2c", "sha256": "3087a5c331e3315760f807a094f704af85319d033b85b10febbbe3ac91c87bfc" }, "downloads": -1, "filename": "test_steps-0.5.1.tar.gz", "has_sig": false, "md5_digest": "898febfaeefb79f0043fe580a94f4c2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11522, "upload_time": "2015-01-21T13:07:34", "url": "https://files.pythonhosted.org/packages/61/01/a160a4e4e9136e9727b944e6b00077760d6c2f9f872b7d5a85ad159d67b2/test_steps-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "85cc3a74383a9a54fbea5898530097d0", "sha256": "14fc1aaafb609525f4fce27359224d1679ab31657331f50f334cd8e793409ac3" }, "downloads": -1, "filename": "test_steps-0.5.2.tar.gz", "has_sig": false, "md5_digest": "85cc3a74383a9a54fbea5898530097d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11622, "upload_time": "2015-01-29T00:14:12", "url": "https://files.pythonhosted.org/packages/22/8f/b165cb0d8f41334f8eda8b895f51ad30bb0cad91cf1a5ddc14ce7e8c4304/test_steps-0.5.2.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "b4a9ada217169413126c33cbd9d6f6ad", "sha256": "9c4636de34866c1c4c01c34bcaf60b6793363146af8207e8db3777250de39934" }, "downloads": -1, "filename": "test_steps-0.6.2.tar.gz", "has_sig": false, "md5_digest": "b4a9ada217169413126c33cbd9d6f6ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11821, "upload_time": "2015-04-15T23:58:59", "url": "https://files.pythonhosted.org/packages/52/4e/bfdcde5a885920e7dd4b86b0a3f17944c8ade958f04a250a299edf2f9cd7/test_steps-0.6.2.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "cfd3e14a6bed1c5598029046f0a39e99", "sha256": "b75f536c094c4cd0d694e96ea096186934a66f3212137d437b109c42363b0bb9" }, "downloads": -1, "filename": "test_steps-0.7.1.tar.gz", "has_sig": false, "md5_digest": "cfd3e14a6bed1c5598029046f0a39e99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13213, "upload_time": "2016-09-17T08:22:25", "url": "https://files.pythonhosted.org/packages/96/37/9dd56d85760a9679e79e26e576d7045edc421c41114436ec1f03ab4ec2ab/test_steps-0.7.1.tar.gz" } ], "0.8.4": [ { "comment_text": "", "digests": { "md5": "3a08d048b5813fdd027f992655de7ca6", "sha256": "72abd55caf489b8235336507a9dc3c528bfc4957d0e055c7da2fd286eb92a3d1" }, "downloads": -1, "filename": "test_steps-0.8.4.tar.gz", "has_sig": false, "md5_digest": "3a08d048b5813fdd027f992655de7ca6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13902, "upload_time": "2016-09-19T14:44:58", "url": "https://files.pythonhosted.org/packages/5e/a2/b2d00acad8d0fe49100a808c07587bad9595d507113138920c46ff35a1f5/test_steps-0.8.4.tar.gz" } ], "0.8.6": [ { "comment_text": "", "digests": { "md5": "6ec728ee1655db64e3ccab20b31a4e5c", "sha256": "e00a8a9505f875e4496e465df9e17db473320201a2edfcd2a0ba0d5608a2d21c" }, "downloads": -1, "filename": "test_steps-0.8.6.tar.gz", "has_sig": false, "md5_digest": "6ec728ee1655db64e3ccab20b31a4e5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14163, "upload_time": "2016-09-20T05:18:36", "url": "https://files.pythonhosted.org/packages/22/d3/737d4bc65882ceca42e483e0dd20cf5267f6786c582b83e474887b317eeb/test_steps-0.8.6.tar.gz" } ], "0.8.8": [ { "comment_text": "", "digests": { "md5": "d9df86bb47643dbc6381f47510795b03", "sha256": "0460869b7dcd99617b4b99fe5ba28d5a57e31592695a0813e4cdc11e0ce945c2" }, "downloads": -1, "filename": "test_steps-0.8.8.tar.gz", "has_sig": false, "md5_digest": "d9df86bb47643dbc6381f47510795b03", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14393, "upload_time": "2016-11-02T10:19:49", "url": "https://files.pythonhosted.org/packages/8e/ab/32f5f850fb094e2fddc746f928c8b45c95d4842bb343db6f6b7f172ecfd5/test_steps-0.8.8.tar.gz" } ], "0.8.9": [ { "comment_text": "", "digests": { "md5": "0f37ff48662b51e9c11633a6a3420fe9", "sha256": "fad29f341c2e37d925620a1913c0ae3b4c57595e4601f12fa7de062ad10cf018" }, "downloads": -1, "filename": "test_steps-0.8.9.tar.gz", "has_sig": false, "md5_digest": "0f37ff48662b51e9c11633a6a3420fe9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14446, "upload_time": "2016-11-03T02:12:30", "url": "https://files.pythonhosted.org/packages/38/7a/a0eb20968d1175c59d3d967f842a31260ee3f2e10975206935c0632a8608/test_steps-0.8.9.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "aa073378b938f1ae46ca7e0ca0cb6684", "sha256": "da92746a722b276a6c0f46470f9d7c8a9e14b9eb230927a147ab27feaff58506" }, "downloads": -1, "filename": "test_steps-0.9.0.tar.gz", "has_sig": false, "md5_digest": "aa073378b938f1ae46ca7e0ca0cb6684", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14502, "upload_time": "2017-01-06T10:39:57", "url": "https://files.pythonhosted.org/packages/74/f0/51321fc4e7b43ed3345404ed4e91d2f7a5c4d52501334b8f828aa90c826d/test_steps-0.9.0.tar.gz" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "56e04ce3a656b30ccb3c8d6f32b33f02", "sha256": "fd3c97991dbfd1ef080541320a24705853ad64b81c92a74a07960b07a2bf994e" }, "downloads": -1, "filename": "test_steps-0.9.7.tar.gz", "has_sig": false, "md5_digest": "56e04ce3a656b30ccb3c8d6f32b33f02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15205, "upload_time": "2017-06-20T06:23:53", "url": "https://files.pythonhosted.org/packages/17/7f/7c2dc1dd60ca4a76b48852310de8810c53dff90658f7d4306e8bebd98a04/test_steps-0.9.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "56e04ce3a656b30ccb3c8d6f32b33f02", "sha256": "fd3c97991dbfd1ef080541320a24705853ad64b81c92a74a07960b07a2bf994e" }, "downloads": -1, "filename": "test_steps-0.9.7.tar.gz", "has_sig": false, "md5_digest": "56e04ce3a656b30ccb3c8d6f32b33f02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15205, "upload_time": "2017-06-20T06:23:53", "url": "https://files.pythonhosted.org/packages/17/7f/7c2dc1dd60ca4a76b48852310de8810c53dff90658f7d4306e8bebd98a04/test_steps-0.9.7.tar.gz" } ] }