{ "info": { "author": "Michael Farrugia", "author_email": "mike.farrugia@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "The json file `example_config/configuration.json` contains an example configuration of Dtest, Spark, and the data elements and tests that need to be executed. \n\nThere are 2 main types of connections:\n* Database connections\n* File connections (this will be subdivided into local and S3)\n\nThe data definition defines one of 3 things:\n* A database table\n* A file (csv or parquet)\n* A database query\n\nThe tests define the tests that can be executed. These are the following tests that currently can be executed:\n\n*unique* - check for the uniqueness of a list of fields\n```\nRequired:\n{ \"fields\" : [list of fields to check for uniqueness]\n \"dataset\" : [the dataset against which you're running the test for]\n}\n\nOptional:\n{ \"filter\" : [a sql syntax filter] }\n```\n\nExample:\n```\n \"product-id-uniqueness\": {\n \"description\": \"product_id unique check\",\n \"test_type\": \"unique\",\n \"dataset\": \"table_name\",\n \"field\": [\"product_id\"],\n \"severity\": \"Error\"\n }\n```\n\n*foreign_key* - do a relational foreign key constraint, by checking if a field in one the secondary table all exists in the primary key table.\n\n```\nRequired:\n{\n \"parent_dataset\" : [the parent dataset (one with primary key)]\n \"parent_field\" : [the field name of the parent dataset]\n \"child_dataset\" : [the child dataset]\n \"child_field\" : [the field in the child dataset]\n}\n\nOptional:\n{ \"filter\" : [a sql syntax filter that is applied to both tables] }\n```\n\nExample:\n```\n \"customer-transaction-fk\": {\n \"description\": \"customer vs transaction test\",\n \"test_type\": \"foreign_key\",\n \"parent_dataset\": \"table_name\",\n \"parent_field\": \"customer_id\",\n \"child_dataset\": \"table_name\",\n \"child_field\": \"transaction_id\",\n \"filter\" : \"product_id is not null\",\n \"severity\": \"Error\"\n }\n```\n\n*filter* - checks the number of records that match the filter. The test will fail if a result > 0 is returned. The failed return value is the number of records returned.\n\n```\nRequired:\n{\n \"filter\": [an sql valid filter for the dataset in question]\n \"dataset\" : [the dataset against which you're running the test for]\n}\n```\n\nExample:\n```\n \"gender-null\": {\n \"description\": \"gender null\",\n \"test_type\": \"filter\",\n \"dataset\": \"table_name\",\n \"filter\": \"gender is null\",\n \"severity\": \"Info\"\n }\n```\n\n\n*field_accuracy* - compare two rows that should have identical data and calculate statistics about the accuracy of the data. This test does not succeed or fail, but returns a table with statistics on the datasets.\n\n```\nRequired:\n{\n \"fields\" : [an array with the two fields to compare in the datast]\n \"dataset\" : [the dataset against which you're running the test for]\n}\n```\n\nExample\n```\n \"accuracy-check\": {\n \"description\": \"Compare the value of two fields\",\n \"test_type\": \"field_accuracy\",\n \"dataset\": \"some-file\",\n \"fields\": [\n \"field1\",\n \"field1_b\"\n ]\n }\n```\n\n*data_load_check* - a test to confirm that the data has been loaded across a number of dates\n\n```\nRequired:\n{\n \"date_field\": [the date field to check in the dataset]\n \"dataset\" : [the dataset to check]\n \"start_date\" : [the start date for the date load check, format YYYYMMDD]\n \"end_date\" : [the end date for the date load check, format YYYYMMDD]\n \"date_table\" : the name of the date table\n \"date_type\" : the type of date that will be used, must be one of the following (\"string_8ch\", \"string_dash\", \"date\") \n}\n```\n\nNote: The date table needs to be available to run this test. This table should have a list of all the date for the required period. \n\nThere are two types of date formats; \n* string_8ch in the format YYYYMMDD\n* string_dash or date in the format YYYY-MM-DD\n\nIt should have a date field named {{{date_id}}} (format YYYYMMDD)\n\nExample:\n```\n \"sfmc-send-job-load\": {\n \"description\": \"Check if the send job table has data loaded for all days in May\",\n \"test_type\": \"data_load_check\",\n \"date_field\": \"event_date_id\",\n \"dataset\": \"sfmc-open\",\n \"start_date\": \"20190501\",\n \"end_date\": \"20190531\",\n \"date_table\": \"date-table\",\n \"severity\": \"Warn\",\n \"date_type\": \"date\"\n }\n```\n\n*dataset_size* - a test to make sure that the datset that you are using are within a certain range of rows inclusive. \n\n```\n\nRequired:\n{\n \"min_value\" : [the lowest acceptable value of rows needed in the dataset]\n \"max_value\" : [the highest number of rows allowed in the dataset]\n}\n\n```\nExample\n\n```\n \"dataset_size_test\":{\n \"description\": \"check the number of rows in dataset\",\n \"test_type\": \"dataset_size\",\n \"dataset\": \"flights\",\n \"min_value\": \"5000\",\n \"max_value\": \"6000\",\n \"filter\": \"carrier != 'American Airlines'\",\n \"severity\": \"Error\"\n }\n\n### Optional fields supported in all tests\n\nThere are a number of fields that are supported in all tests as follows:\n\n*severity* - The severity level of the test failure. Can be one of (Error, Warn, Info)\n\n*disabled* - Enables a test to be disabled in the script. Can be either true or false\n\n#### Date decoding\n\nFor date filters one can specify a value of TODAY and a possible offset from today as a partial date. \n\nThe format for specifying a date ofset is {{{TODAY}}} or {{{TODAY-x}}}\n\nFor example:\n```\n \"sfmc-send-job-load\": {\n \"description\": \"Check if the send job table has data loaded for all days\",\n \"test_type\": \"data_load_check\",\n \"date_field\": \"event_date_id\",\n \"dataset\": \"sfmc-open\",\n \"start_date\": \"20190501\",\n \"end_date\": \"{TODAY-1}\",\n \"date_table\": \"date-table\",\n \"severity\": \"Warn\"\n }\n```\n\nThe default is a date string in the format yyyy-mm-dd to support a date field type query on the database. If you need a string, for example to compare with a date_id field you can use the \":STR\" addition to the definition, e.g. TODAY:STR or TODAY:STR-1 (i.e. yesterday in string format)\n\n## Installation\n\n`pip install testaton`\n\n## Requirements\n\nLocal installation of spark if `spark-config:master` is set to `local`\n\n## Execution \n\n`testaton configuration-file.json`\n\n## Configuration\n#### Dtest\nSee [Dtest](https://github.com/sjensen85/dtest) documentation.\n`test-suite-metadata` is translated to the `metadata` argument\n`message-broker-config` is translated to the `connectionConfig` argument\n\n#### Spark\nThe configuration values for Spark are the master node and the application name. These translate to the corresponding arguments needed to build a SparkSession. More information can be found in the official [SparkSession documentation](https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html?highlight=sparksession#pyspark.sql.SparkSession.Builder).\n\nThe `master` configuration variable sets the Spark master URL to connect to, such as \u201clocal\u201d to run locally, \u201clocal[4]\u201d to run locally with 4 cores, or \u201cspark://ip-of-master:7077\u201d to run on a Spark standalone cluster.\n\nThe `app-name` configuration variable sets a name for the application, which will be shown in the Spark web UI.\n\n## TODO\n\n**Testing the testaton**\n- [ ] test all the current available tests on a spark cluster\n- [ ] add unit tests\n\t- [ ] add unit tests for the generate sql code statements \n\n**Enhancements to current tests**\n- [ ] update the unique filter test to check uniqueness of multiple fields\n- [ ] update the daily check test query to support row count validation\n- [ ] design a structure for a generic sql test, e.g. \n```\n \"raw-query-test-example\" : {\n \"description\" : \"NOT IMPLEMENTED!! example of a raw sql test\", \n \"test_type\" : \"custom_sql\",\n \"table\" : \"cinema-file\",\n \"sql_code\" : \"select count(1) error_cells from cinema where cinema_id < 1000\",\n \"validation\" : \"df['error_cells] < 100\"\n }\n```\n\n**New tests and test enhancements**\n- [x] create a test to check for the number of rows in a table are within a range\n- [ ] count of yesterday's record > today + 10%\n- [ ] add optional threshold ranges to the tests\n\n**Other**\n- [ ] json configuration validator (syntax)\n\t- [ ] validation of the existance of files, configurations, etc (semantics)\n- [ ] convert testing code into an extendable class\n- [ ] cross environment test execution (e.g. a table in a database and a file in parquet)\n\n## Done\n\n- [x] add timing calculation to the execution of the test\n- [x] count of null fields > amount \n- [x] complete Dtest integration to the suite (sending the message) \n- [x] add a score function test against two variables from two data sets\n- [x] remove username and password from test file\n- [x] filter : a number is out of range (e.g. mileage < 0)\n- [x] update the documentation to explain the different types of tests \n- [x] ensure that the integration with dtest 0.19 works\n- [x] ensure that sending sample data to the UI works\n\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/mikelupu/testaton", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "testaton", "package_url": "https://pypi.org/project/testaton/", "platform": "", "project_url": "https://pypi.org/project/testaton/", "project_urls": { "Homepage": "https://github.com/mikelupu/testaton" }, "release_url": "https://pypi.org/project/testaton/0.1.12/", "requires_dist": [ "six", "findspark", "pandas", "sqlalchemy", "dtest-framework", "pyhamcrest" ], "requires_python": "", "summary": "A command line tool to allow the testing of datasets", "version": "0.1.12" }, "last_serial": 5651441, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "2094a7d38174c9377586d01993917204", "sha256": "90628b229ddcbc840da3194c407a080414180830e506994e00e7d53565f72e4a" }, "downloads": -1, "filename": "testaton-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2094a7d38174c9377586d01993917204", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7618, "upload_time": "2019-04-15T17:11:34", "url": "https://files.pythonhosted.org/packages/03/6c/ec5431a97df447bd70ba0471f49437300e3c1f9c4a1286a9e46fd3dd6a3e/testaton-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4f1a763324a3354e797725fb764a4d5", "sha256": "75c31396d8700d6cf8df55e40b9a449fe5cbfaff334c03a33155a58ad1c21e52" }, "downloads": -1, "filename": "testaton-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b4f1a763324a3354e797725fb764a4d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6035, "upload_time": "2019-04-15T17:11:36", "url": "https://files.pythonhosted.org/packages/9e/56/1ea5f685aca0164216a919f54d1c475c797159f56e96ade983c88fe06bd1/testaton-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "dbb7a24b4b3dd8412d7a13760e631ba1", "sha256": "c61fd57562b6daa041c596476bf5dd310268f92c2819d576ab94a4363022c887" }, "downloads": -1, "filename": "testaton-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "dbb7a24b4b3dd8412d7a13760e631ba1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13238, "upload_time": "2019-07-29T19:27:31", "url": "https://files.pythonhosted.org/packages/f1/29/cb2d8292c74bf8d03a1b8cecc0c5711c86111218054177a2a45f700e61c1/testaton-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df473fbea2d01c50ef03111a436e4168", "sha256": "780f736f54d30fe3d50d7a0cdd72ea3129e863dc955a7375b639c8855c65c018" }, "downloads": -1, "filename": "testaton-0.1.10.tar.gz", "has_sig": false, "md5_digest": "df473fbea2d01c50ef03111a436e4168", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13742, "upload_time": "2019-07-29T19:27:33", "url": "https://files.pythonhosted.org/packages/df/85/f1c8cc8eb54c138a1d6cba7e3b3602600b9c66bdb24ee83397775dcfad0f/testaton-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "77c58f907a3b19c35baf558c61479f8a", "sha256": "0b86672c5e6083b76b96047e920c387793da46467bc3513ccc84335f7b1e3f25" }, "downloads": -1, "filename": "testaton-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "77c58f907a3b19c35baf558c61479f8a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13668, "upload_time": "2019-07-31T21:03:48", "url": "https://files.pythonhosted.org/packages/9e/c8/62c9cc93796fadb4be11f22d7f098eca8e7c54d4c86a9e1bc532ca055964/testaton-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e3335e90a65a0c0d377233c940e597f", "sha256": "0878ee13d206b2f1d8743d3067f76ce1c831612813d429899ca6ee5948b45e3b" }, "downloads": -1, "filename": "testaton-0.1.11.tar.gz", "has_sig": false, "md5_digest": "5e3335e90a65a0c0d377233c940e597f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14452, "upload_time": "2019-07-31T21:03:50", "url": "https://files.pythonhosted.org/packages/9e/98/577332c689bf3a5c826b37c8c8cd3c3cfdeb5b05f035c4c1c2856704235e/testaton-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "d27caeecf2f0057eb6de03f0c3cc702c", "sha256": "6f33e924dc5ee4ba6a3127b430c29e04430c1a51f41ff10c60e6bac2f83cf8e8" }, "downloads": -1, "filename": "testaton-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "d27caeecf2f0057eb6de03f0c3cc702c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15795, "upload_time": "2019-08-08T17:35:38", "url": "https://files.pythonhosted.org/packages/19/39/671c36d61ba1ed9466fc633fbda4e83ba280783840919d59cc19aae98a0e/testaton-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c44fa59c029d52bc3cc12a1c75f1e204", "sha256": "86579bec6fd1f9e67bf33f4632eb408a7a1a00c924e1b2c6f07affab57f419ee" }, "downloads": -1, "filename": "testaton-0.1.12.tar.gz", "has_sig": false, "md5_digest": "c44fa59c029d52bc3cc12a1c75f1e204", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16081, "upload_time": "2019-08-08T17:35:39", "url": "https://files.pythonhosted.org/packages/80/4b/40b20133233fbff01e4b706479aed4c238d1a3abf963fdca0ee8c8db30bb/testaton-0.1.12.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "d028dd2638a72ffc998646347ae9b8ab", "sha256": "a951176d9810f43cc629ac8a3452c4db9759db6ac139b61b3b78127ee4c0ec79" }, "downloads": -1, "filename": "testaton-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d028dd2638a72ffc998646347ae9b8ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8110, "upload_time": "2019-04-23T20:57:50", "url": "https://files.pythonhosted.org/packages/b3/f4/28f155800284a4af7895a50dd6ce9edc18a4773caf6edd00f456f38996d1/testaton-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4822a9bd62c509ae0444b5849cfd59a", "sha256": "ca54728865e5422c7766326241808f83fcf7aebe5564cc4aa0598d8a80781d80" }, "downloads": -1, "filename": "testaton-0.1.2.tar.gz", "has_sig": false, "md5_digest": "a4822a9bd62c509ae0444b5849cfd59a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6718, "upload_time": "2019-04-23T20:57:51", "url": "https://files.pythonhosted.org/packages/cf/01/2ca78f92b28ee880d217a7a17bb1e8ced9751a68a04721a7bde19275e9ab/testaton-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "92a28cd2a6b3c1c4d9a0dcc339fe8fea", "sha256": "108ed0edfd303cb4ad70d033df0e28c9f155bca194a3c645c87ea24c1850cd55" }, "downloads": -1, "filename": "testaton-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "92a28cd2a6b3c1c4d9a0dcc339fe8fea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8121, "upload_time": "2019-04-24T15:44:23", "url": "https://files.pythonhosted.org/packages/ad/c7/a5a45838006739393d182f47c57588a95a32fe15e3a76cf763a12b45bc94/testaton-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "84788c41bc698b28f37def9b268c181c", "sha256": "d8c808cdeed954178de146496cfd0d284d70e09529f714f0c15e7cf0dcff0528" }, "downloads": -1, "filename": "testaton-0.1.3.tar.gz", "has_sig": false, "md5_digest": "84788c41bc698b28f37def9b268c181c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6722, "upload_time": "2019-04-24T15:44:24", "url": "https://files.pythonhosted.org/packages/ac/10/4e74e62c1869f26b3c2522290c932ac07382fc3a876a7484756f118454c6/testaton-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "85f03f49e8f40b5dd127263b07436605", "sha256": "9daaea81b26fed719ac986754265fc55e2f7cf3b836e4f44fba80ed659fe37ad" }, "downloads": -1, "filename": "testaton-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "85f03f49e8f40b5dd127263b07436605", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8132, "upload_time": "2019-04-24T15:54:07", "url": "https://files.pythonhosted.org/packages/fb/48/f9f10067d7093077c04b28c8d79cdc04475b4c6ab042f5f3ed55cadc5673/testaton-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88b375dbf3b8092396631d38690985ba", "sha256": "99b1a341722b021ec8dcc424eeb1cdd36e6cf942ad40cef5f971239f7105fb30" }, "downloads": -1, "filename": "testaton-0.1.4.tar.gz", "has_sig": false, "md5_digest": "88b375dbf3b8092396631d38690985ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6740, "upload_time": "2019-04-24T15:54:09", "url": "https://files.pythonhosted.org/packages/40/33/0ac03a6c6d4497a2a11da2f68f8e47f03034b262046d317fa5919426e3ce/testaton-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "4fe34e29cab400362d70a9395171afd2", "sha256": "87a637a32c2f15b55b59911b422d2324202e3a02e54b04c8292b0144de0c32b8" }, "downloads": -1, "filename": "testaton-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "4fe34e29cab400362d70a9395171afd2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8126, "upload_time": "2019-04-24T17:13:27", "url": "https://files.pythonhosted.org/packages/55/f1/3bb0612443f07ad5c36e9a1c1968bb01a82de54b0b188136f1de29cf4634/testaton-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "804ff449c480b2e36ac7d8ec7933b031", "sha256": "f9a5cf5ac845d8e6dc55afcfde1fa28a345c5a30ed4fe6fb64023e12aff46ed8" }, "downloads": -1, "filename": "testaton-0.1.5.tar.gz", "has_sig": false, "md5_digest": "804ff449c480b2e36ac7d8ec7933b031", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6735, "upload_time": "2019-04-24T17:13:28", "url": "https://files.pythonhosted.org/packages/8c/a7/6fbd75c8e78dda6466605c3d176a7dd72937bc6d25193c09356a36c2a88b/testaton-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "623de8119528b70ca81d752378543dd1", "sha256": "5d69510e53b5695c95377501df5c7f3d111292c0d55fa343dd2154794e74570e" }, "downloads": -1, "filename": "testaton-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "623de8119528b70ca81d752378543dd1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8123, "upload_time": "2019-04-24T17:38:31", "url": "https://files.pythonhosted.org/packages/e9/41/102936421f28b4ef5632e737ecc353d27cf191bb4eacea09bb1dfae8c5b4/testaton-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df9e142b7fe1c191f10623bad00a8238", "sha256": "add5e2386d40bd1f7fab6b01a6a454596f06128efbbfa340df3c540def3c7b31" }, "downloads": -1, "filename": "testaton-0.1.6.tar.gz", "has_sig": false, "md5_digest": "df9e142b7fe1c191f10623bad00a8238", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6736, "upload_time": "2019-04-24T17:38:32", "url": "https://files.pythonhosted.org/packages/d0/9d/28bd04be0c1e0e08fcff739523dc2fe0ee2b7ad7ff615477d85e570931d1/testaton-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "3ee3b4c1fde2e7f4daa92e11613634e3", "sha256": "22c31cfc5bf1df58d21f985ee7193ee495d7f99fecf5c449578b1688e09fa269" }, "downloads": -1, "filename": "testaton-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "3ee3b4c1fde2e7f4daa92e11613634e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8135, "upload_time": "2019-04-24T18:32:34", "url": "https://files.pythonhosted.org/packages/46/d9/a81af5f3aaa4490612a9b55f6625a3404daf4a96d5de81862e0b4d022789/testaton-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "425f81f92ec00bc1337935e0f7f6eba0", "sha256": "0664e960036696674b0eee4bfdfc211a4f5623c39fe7ccb979e0eec7128ce1a3" }, "downloads": -1, "filename": "testaton-0.1.7.tar.gz", "has_sig": false, "md5_digest": "425f81f92ec00bc1337935e0f7f6eba0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6743, "upload_time": "2019-04-24T18:32:36", "url": "https://files.pythonhosted.org/packages/b3/84/c8123cb4af2117160bb2606a463a73e8129cb88312e62fdf81e09d82f04e/testaton-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "38fd9e6e8457ff356f6093278097f4f7", "sha256": "3a8ab4f39466f47fdadd022abe7e824f09337793ac52f32bb062bc7c171b4a60" }, "downloads": -1, "filename": "testaton-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "38fd9e6e8457ff356f6093278097f4f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8644, "upload_time": "2019-06-03T22:42:27", "url": "https://files.pythonhosted.org/packages/ce/f8/e55efc0d5464a73afe7d2d613e4d366aae26304dbe7fce07ed462d7b9976/testaton-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6404a898614a514f169f5cc4f64dc1aa", "sha256": "d20663e3ec5ecb807bf18055f2a907d909ada7781fbfa1d2ea222b8f00b274d8" }, "downloads": -1, "filename": "testaton-0.1.8.tar.gz", "has_sig": false, "md5_digest": "6404a898614a514f169f5cc4f64dc1aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7582, "upload_time": "2019-06-03T22:42:29", "url": "https://files.pythonhosted.org/packages/8a/e5/f995f5ce9bd61cfc4fb6cdb9f141a314972c97876b3689144443d196c03f/testaton-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "6b16289fdd9ccc8eef3cba1e677da0cd", "sha256": "1a79f9916658c1c99444ddd24551f009ea2f66cfbed861652d6727091ff80e00" }, "downloads": -1, "filename": "testaton-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "6b16289fdd9ccc8eef3cba1e677da0cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12404, "upload_time": "2019-06-18T23:55:06", "url": "https://files.pythonhosted.org/packages/45/dd/439d0a308af652ef5cd2139112c668901b9ddfac1b9c649c0b9321dc874b/testaton-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0dfb0aaf3a2ecabdfbbe1061058a6e91", "sha256": "49d5ed8da8b299ea7563453b821f79e8bbd2bb2f306fc98ee0be3655a7c6a6cd" }, "downloads": -1, "filename": "testaton-0.1.9.tar.gz", "has_sig": false, "md5_digest": "0dfb0aaf3a2ecabdfbbe1061058a6e91", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13254, "upload_time": "2019-06-18T23:55:08", "url": "https://files.pythonhosted.org/packages/87/8c/586ecbf5cd3aeb04e85af85b5680bc707d70e4e5586cdc6efd4ac797ab05/testaton-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d27caeecf2f0057eb6de03f0c3cc702c", "sha256": "6f33e924dc5ee4ba6a3127b430c29e04430c1a51f41ff10c60e6bac2f83cf8e8" }, "downloads": -1, "filename": "testaton-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "d27caeecf2f0057eb6de03f0c3cc702c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15795, "upload_time": "2019-08-08T17:35:38", "url": "https://files.pythonhosted.org/packages/19/39/671c36d61ba1ed9466fc633fbda4e83ba280783840919d59cc19aae98a0e/testaton-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c44fa59c029d52bc3cc12a1c75f1e204", "sha256": "86579bec6fd1f9e67bf33f4632eb408a7a1a00c924e1b2c6f07affab57f419ee" }, "downloads": -1, "filename": "testaton-0.1.12.tar.gz", "has_sig": false, "md5_digest": "c44fa59c029d52bc3cc12a1c75f1e204", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16081, "upload_time": "2019-08-08T17:35:39", "url": "https://files.pythonhosted.org/packages/80/4b/40b20133233fbff01e4b706479aed4c238d1a3abf963fdca0ee8c8db30bb/testaton-0.1.12.tar.gz" } ] }