{ "info": { "author": "Matthew Balvanz", "author_email": "matthew.balvanz@workiva.com", "bugtrack_url": null, "classifiers": [], "description": "# pact-python\n\n[![slack](http://slack.pact.io/badge.svg)](http://slack.pact.io)\n[![Build Status](https://travis-ci.org/pact-foundation/pact-python.svg?branch=master)](https://travis-ci.org/pact-foundation/pact-python)\n[![License](https://img.shields.io/github/license/pact-foundation/pact-python.svg?maxAge=2592000)](https://github.com/pact-foundation/pact-python/blob/master/LICENSE)\n\nPython version of Pact. Enables consumer driven contract testing,\nproviding a mock service and DSL for the consumer project, and\ninteraction playback and verification for the service provider project.\nCurrently supports version 2 of the [Pact specification].\n\nFor more information about what Pact is, and how it can help you\ntest your code more efficiently, check out the [Pact documentation].\n\n# How to use pact-python\n\n## Installation\n```\npip install pact-python\n```\n\n## Writing a Pact\nCreating a complete contract is a two step process:\n\n1. Create a test on the consumer side that declares the expectations it has of the provider\n2. Create a provider state that allows the contract to pass when replayed against the provider\n\n## Writing the Consumer Test\n\nIf we have a method that communicates with one of our external services, which we'll call\n`Provider`, and our product, `Consumer` is hitting an endpoint on `Provider` at\n`/users/` to get information about a particular user.\n\nIf the code to fetch a user looked like this:\n\n```python\nimport requests\n\n\ndef user(user_name):\n \"\"\"Fetch a user object by user_name from the server.\"\"\"\n uri = 'http://localhost:1234/users/' + user_name\n return requests.get(uri).json()\n```\n\nThen `Consumer`'s contract test might look something like this:\n\n```python\nimport atexit\nimport unittest\n\nfrom pact import Consumer, Provider\n\n\npact = Consumer('Consumer').has_pact_with(Provider('Provider'))\npact.start_service()\natexit.register(pact.stop_service)\n\n\nclass GetUserInfoContract(unittest.TestCase):\n def test_get_user(self):\n expected = {\n 'username': 'UserA',\n 'id': 123,\n 'groups': ['Editors']\n }\n\n (pact\n .given('UserA exists and is not an administrator')\n .upon_receiving('a request for UserA')\n .with_request('get', '/users/UserA')\n .will_respond_with(200, body=expected))\n\n with pact:\n result = user('UserA')\n\n self.assertEqual(result, expected)\n\n```\n\nThis does a few important things:\n\n - Defines the Consumer and Provider objects that describe our product and our service under test\n - Uses `given` to define the setup criteria for the Provider `UserA exists and is not an administrator`\n - Defines what the request that is expected to be made by the consumer will contain\n - Defines how the server is expected to respond\n\nUsing the Pact object as a [context manager], we call our method under test\nwhich will then communicate with the Pact mock service. The mock service will respond with\nthe items we defined, allowing us to assert that the method processed the response and\nreturned the expected value. If you want more control over when the mock service is\nconfigured and the interactions verified, use the `setup` and `verify` methods, respectively:\n\n```python\n (pact\n .given('UserA exists and is not an administrator')\n .upon_receiving('a request for UserA')\n .with_request('get', '/users/UserA')\n .will_respond_with(200, body=expected))\n\n pact.setup()\n # Some additional steps before running the code under test\n result = user('UserA')\n # Some additional steps before verifying all interactions have occurred\n pact.verify()\n```\n\n### Requests\n\nWhen defining the expected HTTP request that your code is expected to make you\ncan specify the method, path, body, headers, and query:\n\n```python\npact.with_request(\n method='GET',\n path='/api/v1/my-resources/',\n query={'search': 'example'}\n)\n```\n\n`query` is used to specify URL query parameters, so the above example expects\na request made to `/api/v1/my-resources/?search=example`.\n\n```python\npact.with_request(\n method='POST',\n path='/api/v1/my-resources/123',\n body={'user_ids': [1, 2, 3]},\n headers={'Content-Type': 'application/json'},\n)\n```\n\nYou can define exact values for your expected request like the examples above,\nor you can use the matchers defined later to assist in handling values that are\nvariable.\n\nThe default hostname and port for the Pact mock service will be\n`localhost:1234` but you can adjust this during Pact creation:\n\n```python\nfrom pact import Consumer, Provider\npact = Consumer('Consumer').has_pact_with(\n Provider('Provider'), host_name='mockservice', port=8080)\n```\n\nThis can be useful if you need to run to create more than one Pact for your test\nbecause your code interacts with two different services. It is important to note\nthat the code you are testing with this contract _must_ contact the mock service.\nSo in this example, the `user` method could accept an argument to specify the\nlocation of the server, or retrieve it from an environment variable so you can\nchange its URI during the test.\n\nThe mock service offers you several important features when building your contracts:\n- It provides a real HTTP server that your code can contact during the test and provides the responses you defined.\n- You provide it with the expectations for the request your code will make and it will assert the contents of the actual requests made based on your expectations.\n- If a request is made that does not match one you defined or if a request from your code is missing it will return an error with details.\n- Finally, it will record your contracts as a JSON file that you can store in your repository or publish to a Pact broker.\n\n## Expecting Variable Content\nThe above test works great if that user information is always static, but what happens if\nthe user has a last updated field that is set to the current time every time the object is\nmodified? To handle variable data and make your tests more robust, there are 3 helpful matchers:\n\n### Term(matcher, generate)\nAsserts the value should match the given regular expression. You could use this\nto expect a timestamp with a particular format in the request or response where\nyou know you need a particular format, but are unconcerned about the exact date:\n\n```python\nfrom pact import Term\n...\nbody = {\n 'username': 'UserA',\n 'last_modified': Term('\\d+-\\d+-\\d+T\\d+:\\d+:\\d+', '2016-12-15T20:16:01')\n}\n\n(pact\n .given('UserA exists and is not an administrator')\n .upon_receiving('a request for UserA')\n .with_request('get', '/users/UserA/info')\n .will_respond_with(200, body=body))\n```\n\nWhen you run the tests for the consumer, the mock service will return the value you provided\nas `generate`, in this case `2016-12-15T20:16:01`. When the contract is verified on the\nprovider, the regex will be used to search the response from the real provider service\nand the test will be considered successful if the regex finds a match in the response.\n\n### Like(matcher)\nAsserts the element's type matches the matcher. For example:\n\n```python\nfrom pact import Like\nLike(123) # Matches if the value is an integer\nLike('hello world') # Matches if the value is a string\nLike(3.14) # Matches if the value is a float\n```\nThe argument supplied to `Like` will be what the mock service responds with.\n\nWhen a dictionary is used as an argument for Like, all the child objects (and their child objects etc.) will be matched according to their types, unless you use a more specific matcher like a Term.\n\n```python\nfrom pact import Like, Term\nLike({\n 'username': Term('[a-zA-Z]+', 'username'),\n 'id': 123, # integer\n 'confirmed': False, # boolean\n 'address': { # dictionary\n 'street': '200 Bourke St' # string\n }\n})\n\n```\n\n### EachLike(matcher, minimum=1)\nAsserts the value is an array type that consists of elements\nlike the one passed in. It can be used to assert simple arrays:\n\n```python\nfrom pact import EachLike\nEachLike(1) # All items are integers\nEachLike('hello') # All items are strings\n```\n\nOr other matchers can be nested inside to assert more complex objects:\n\n```python\nfrom pact import EachLike, Term\nEachLike({\n 'username': Term('[a-zA-Z]+', 'username'),\n 'id': 123,\n 'groups': EachLike('administrators')\n})\n```\n\n> Note, you do not need to specify everything that will be returned from the Provider in a\n> JSON response, any extra data that is received will be ignored and the tests will still pass.\n\n> Note, to get the generated values from an object that can contain matchers like Term, Like, EachLike, etc. \n> for assertion in self.assertEqual(result, expected) you may need to use get_generated_values() helper function:\n\n```python\nfrom pact.matchers import get_generated_values\nself.assertEqual(result, get_generated_values(expected))\n```\n\nFor more information see [Matching](https://docs.pact.io/getting_started/matching)\n\n## Verifying Pacts Against a Service\n\nIn addition to writing Pacts for Python consumers, you can also verify those Pacts\nagainst a provider of any language. After installing pact-python a `pact-verifier`\napplication should be available. To get details about its use you can call it with the\nhelp argument:\n\n```bash\npact-verifier --help\n```\n\nThe simplest example is verifying a server with locally stored Pact files and no provider\nstates:\n\n```bash\npact-verifier --provider-base-url=http://localhost:8080 --pact-url=./pacts/consumer-provider.json\n```\n\nWhich will immediately invoke the Pact verifier, making HTTP requests to the server located\nat `http://localhost:8080` based on the Pacts in `./pacts/consumer-provider.json` and\nreporting the results.\n\nThere are several options for configuring how the Pacts are verified:\n\n###### --provider-base-url\n\nRequired. Defines the URL of the server to make requests to when verifying the Pacts.\n\n###### --pact-url\n\nRequired if --pact-urls not specified. The location of a Pact file you want\nto verify. This can be a URL to a [Pact Broker] or a local path, to provide\nmultiple files, specify multiple arguments.\n\n```\npact-verifier --provider-base-url=http://localhost:8080 --pact-url=./pacts/one.json --pact-url=./pacts/two.json\n```\n\n###### --pact-urls\n\nRequired if --pact-url not specified. The location of the Pact files you want\nto verify. This can be a URL to a [Pact Broker] or one or more local paths, separated by a comma.\n\n###### --provider-states-url\n\n_DEPRECATED AFTER v 0.6.0._ The URL where your provider application will produce the list of available provider states.\nThe verifier calls this URL to ensure the Pacts specify valid states before making the HTTP\nrequests.\n\n###### --provider-states-setup-url\n\nThe URL which should be called to setup a specific provider state before a Pact is verified. This URL will be called with a POST request, and the JSON body `{consumer: 'Consumer name', state: 'a thing exists'}`.\n\n###### --pact-broker-username\n\nThe username to use when contacting the Pact Broker.\n\n###### --pact-broker-password\n\nThe password to use when contacting the Pact Broker. You can also specify this value\nas the environment variable `PACT_BROKER_PASSWORD`.\n\n### Provider States\nIn many cases, your contracts will need very specific data to exist on the provider\nto pass successfully. If you are fetching a user profile, that user needs to exist,\nif querying a list of records, one or more records needs to exist. To support\ndecoupling the testing of the consumer and provider, Pact offers the idea of provider\nstates to communicate from the consumer what data should exist on the provider.\n\nWhen setting up the testing of a provider you will also need to setup the management of\nthese provider states. The Pact verifier does this by making additional HTTP requests to\nthe `--provider-states-setup-url` you provide. This URL could be\non the provider application or a separate one. Some strategies for managing state include:\n\n- Having endpoints in your application that are not active in production that create and delete your datastore state\n- A separate application that has access to the same datastore to create and delete, like a separate App Engine module or Docker container pointing to the same datastore\n- A standalone application that can start and stop the other server with different datastore states\n\nFor more information about provider states, refer to the [Pact documentation] on [Provider States].\n\n# Development\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md)\n\nTo setup a development environment:\n\n1. If you want to run tests for all Python versions, install 2.7, 3.3, 3.4, 3.5, and 3.6 from source or using a tool like [pyenv]\n2. Its recommended to create a Python [virtualenv] for the project\n\nThe setup the environment, run tests, and package the application, run:\n`make release`\n\nIf you are just interested in packaging pact-python so you can install it using pip:\n\n`make package`\n\nThis creates a `dist/pact-python-N.N.N.tar.gz` file, where the Ns are the current version.\nFrom there you can use pip to install it:\n\n`pip install ./dist/pact-python-N.N.N.tar.gz`\n\n## Testing\n\nThis project has unit and end to end tests, which can both be run from make:\n\nUnit: `make test`\n\nEnd to end: `make e2e`\n\n## Contact\n\nJoin us in slack: [![slack](http://slack.pact.io/badge.svg)](http://slack.pact.io)\n\nor\n\n- Twitter: [@pact_up]\n- Stack Overflow: stackoverflow.com/questions/tagged/pact\n\n[bundler]: http://bundler.io/\n[context manager]: https://en.wikibooks.org/wiki/Python_Programming/Context_Managers\n[Pact]: https://www.gitbook.com/book/pact-foundation/pact/details\n[Pact Broker]: https://docs.pact.io/documentation/sharings_pacts.html\n[Pact documentation]: https://docs.pact.io/\n[Pact Mock Service]: https://github.com/bethesque/pact-mock_service\n[Pact specification]: https://github.com/pact-foundation/pact-specification\n[Provider States]: https://docs.pact.io/documentation/provider_states.html\n[pact-provider-verifier]: https://github.com/pact-foundation/pact-provider-verifier\n[pyenv]: https://github.com/pyenv/pyenv\n[rvm]: https://rvm.io/\n[rbenv]: https://github.com/rbenv/rbenv\n[virtualenv]: http://python-guide-pt-br.readthedocs.io/en/latest/dev/virtualenvs/", "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/pact-foundation/pact-python", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "pact-python", "package_url": "https://pypi.org/project/pact-python/", "platform": "", "project_url": "https://pypi.org/project/pact-python/", "project_urls": { "Homepage": "https://github.com/pact-foundation/pact-python" }, "release_url": "https://pypi.org/project/pact-python/0.19.0/", "requires_dist": null, "requires_python": "", "summary": "Tools for creating and verifying consumer driven contracts using the Pact framework.", "version": "0.19.0" }, "last_serial": 5910018, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "714233981e1e7c0df2916bb86eea8a1a", "sha256": "8af8dc2c7e5b6528b3be07dd10bbe04b57fce87c3cb529a39edb9b6cc1447cca" }, "downloads": -1, "filename": "pact-python-0.10.0.tar.gz", "has_sig": false, "md5_digest": "714233981e1e7c0df2916bb86eea8a1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26212, "upload_time": "2017-11-19T05:33:14", "url": "https://files.pythonhosted.org/packages/87/12/f6afe924b03fdbc30f6a38e9aeb05742574ed5a4c5a1cf9c038e4804db07/pact-python-0.10.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "403280459d4e8927638ee836fc00076e", "sha256": "efca5ab5af8f6f74f9c20f3a4b2493d086dfe95b04cc386be47ae5c0b24f1962" }, "downloads": -1, "filename": "pact-python-0.12.0.tar.gz", "has_sig": false, "md5_digest": "403280459d4e8927638ee836fc00076e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27278, "upload_time": "2017-12-17T16:50:11", "url": "https://files.pythonhosted.org/packages/d7/93/f054243983e8984bb7701376fab9a9c15d5df71c7119cf35fe1e85cb3572/pact-python-0.12.0.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "7eae261f50986973c6d454b940602c11", "sha256": "9aebd8ae34501d33aca209907e7943af01b4e9c3d47654814e31b62f283c3a69" }, "downloads": -1, "filename": "pact-python-0.13.0.tar.gz", "has_sig": false, "md5_digest": "7eae261f50986973c6d454b940602c11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27607, "upload_time": "2018-01-20T22:50:29", "url": "https://files.pythonhosted.org/packages/d8/c9/b52dfd0b29d566c6bbd290b0ecdebe43fe0afc1ddb63024f063e6fcd2229/pact-python-0.13.0.tar.gz" } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "f545c34ebc039ad2181a3d394d553006", "sha256": "278c5e8b37a87185e9bd807e7f40f71d93edefb98f751539a8df247f5a9c6875" }, "downloads": -1, "filename": "pact-python-0.14.0.tar.gz", "has_sig": false, "md5_digest": "f545c34ebc039ad2181a3d394d553006", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27777, "upload_time": "2018-02-04T05:44:10", "url": "https://files.pythonhosted.org/packages/a4/6f/35db3651584619b6e2410ec58df12fa8f4674ddb09173e38e3e4e3cc4333/pact-python-0.14.0.tar.gz" } ], "0.15.0": [ { "comment_text": "", "digests": { "md5": "3432d7c1907eb42df5642214b90b213a", "sha256": "e045e73e6c49d9897dd5ccee9a91006735ecebf3e1382dcc46aaa39a35818f00" }, "downloads": -1, "filename": "pact-python-0.15.0.tar.gz", "has_sig": false, "md5_digest": "3432d7c1907eb42df5642214b90b213a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28222, "upload_time": "2018-03-03T03:29:52", "url": "https://files.pythonhosted.org/packages/9d/42/b54657823f000c20c04a5a803d12a58603eedb11534f3916478ed6c64037/pact-python-0.15.0.tar.gz" } ], "0.16.0": [ { "comment_text": "", "digests": { "md5": "d3d458e9c05576363a1638fdcad95f58", "sha256": "b21f2ebf8337b9df066e97c8380af13bb7355738143ebb2d9946b65a61a40420" }, "downloads": -1, "filename": "pact-python-0.16.0.tar.gz", "has_sig": false, "md5_digest": "d3d458e9c05576363a1638fdcad95f58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28300, "upload_time": "2018-03-03T04:18:38", "url": "https://files.pythonhosted.org/packages/4c/d2/c01e59a071cd25b9b20456912e3eeb9df70d565398be79c2119857165395/pact-python-0.16.0.tar.gz" } ], "0.16.1": [ { "comment_text": "", "digests": { "md5": "d128f79df32eb011804ae34561a17bf5", "sha256": "4107fb92e39a2e917a879d9bfe4ab117e898c73738f6dba4fc8fddc4074c5300" }, "downloads": -1, "filename": "pact-python-0.16.1.tar.gz", "has_sig": false, "md5_digest": "d128f79df32eb011804ae34561a17bf5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28449, "upload_time": "2018-03-16T13:51:26", "url": "https://files.pythonhosted.org/packages/b4/90/c5c3e5195be1f644833e61395059d847b58e9bbb25f0c864534e051ff22b/pact-python-0.16.1.tar.gz" } ], "0.17.0": [ { "comment_text": "", "digests": { "md5": "bfdb9ba015f5eb1f3811cb1f44fcd66a", "sha256": "2524aa2de5ce489e0cb6f40b6c910a67eeaf7c385b6ca084c519efd7b58c3f33" }, "downloads": -1, "filename": "pact-python-0.17.0.tar.gz", "has_sig": false, "md5_digest": "bfdb9ba015f5eb1f3811cb1f44fcd66a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28771, "upload_time": "2018-07-21T03:40:22", "url": "https://files.pythonhosted.org/packages/ef/ca/390d9266fec7ab4255cc8fe8e8637b816898ae33866895ee3d797a792ff7/pact-python-0.17.0.tar.gz" } ], "0.18.0": [ { "comment_text": "", "digests": { "md5": "be70ef8fa6578ec345461ecf89b6f365", "sha256": "63f38ff10779445661fb1029da0ec0183c99ad61583eedcc9eb94a0a53427c91" }, "downloads": -1, "filename": "pact-python-0.18.0.tar.gz", "has_sig": false, "md5_digest": "be70ef8fa6578ec345461ecf89b6f365", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28837, "upload_time": "2018-08-21T14:03:04", "url": "https://files.pythonhosted.org/packages/e6/8a/3049284dbee7c78faf772d1b13e507d32a785b43fc21ee42d9a23240da19/pact-python-0.18.0.tar.gz" } ], "0.19.0": [ { "comment_text": "", "digests": { "md5": "012c4970a21812be08e12286dbea6cb5", "sha256": "fd48f55f3279e850882624bf37d606b1f4e1dc9fa078f6d3f9fe9697c962e417" }, "downloads": -1, "filename": "pact-python-0.19.0.tar.gz", "has_sig": false, "md5_digest": "012c4970a21812be08e12286dbea6cb5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25754, "upload_time": "2019-10-01T02:15:45", "url": "https://files.pythonhosted.org/packages/22/34/e8f6ce98a98b383683b2a91fb81ebb7f7a8f95352a410b97c16ab52c3e2e/pact-python-0.19.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "16a63e6ec5981ce1c7f8e158f8dca975", "sha256": "7ad4d974ce8929a1b916873f376b3542cf6582e521112f530fb862bca1bf9ba7" }, "downloads": -1, "filename": "pact-python-0.4.0.tar.gz", "has_sig": false, "md5_digest": "16a63e6ec5981ce1c7f8e158f8dca975", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60787134, "upload_time": "2017-05-24T22:02:23", "url": "https://files.pythonhosted.org/packages/b7/24/a497fbbbc1fe69fdd5d5ea8b3edc53359c72e755d9fab3910b46b9c4c1d6/pact-python-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "1f07af033da6e0737d6e6d42d29348aa", "sha256": "a8ab853a520ca822bf6cdd9bdc5dbaa0eea33170cc8f8dce132582c54c39b1e5" }, "downloads": -1, "filename": "pact-python-0.4.1.tar.gz", "has_sig": false, "md5_digest": "1f07af033da6e0737d6e6d42d29348aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60732131, "upload_time": "2017-05-31T03:54:02", "url": "https://files.pythonhosted.org/packages/d7/43/9e35a3d4a4486d4eea159f6c9ec0ff745e797c90ba3d1d8f51bcecc3a1db/pact-python-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "a7dd655c06f7dafc9588bdb2b9fec3ab", "sha256": "817e0a925a3475a8544fa4f70b378ef63368fd06ea54d3f53ecfb09af6afb13f" }, "downloads": -1, "filename": "pact-python-0.5.0.tar.gz", "has_sig": false, "md5_digest": "a7dd655c06f7dafc9588bdb2b9fec3ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60812870, "upload_time": "2017-06-19T14:44:55", "url": "https://files.pythonhosted.org/packages/02/5b/2b432a46f699f5cc7db1e01c2831db6468f2cdb221f802de951d723ca21e/pact-python-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "92fdabb0c93e69e4a7fd0ed9308e4fef", "sha256": "209d61e4ce8e5ca34c56418b7c056576df43bd212f0f9d4b45e17e4307e858df" }, "downloads": -1, "filename": "pact-python-0.6.0.tar.gz", "has_sig": false, "md5_digest": "92fdabb0c93e69e4a7fd0ed9308e4fef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18186, "upload_time": "2017-06-21T03:07:15", "url": "https://files.pythonhosted.org/packages/b4/fd/c2cf0d1afee65a09849f5564b7bf71145f356cc675ba96db558928083636/pact-python-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "5ca183405a9d34963461f08ee99f2b42", "sha256": "c257d01774b476b7103145823a15fcbfa45dd67569168d16ae205bc18160dab3" }, "downloads": -1, "filename": "pact-python-0.6.1.tar.gz", "has_sig": false, "md5_digest": "5ca183405a9d34963461f08ee99f2b42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18862, "upload_time": "2017-06-27T01:35:23", "url": "https://files.pythonhosted.org/packages/85/ab/da76f2d598d3bb3f2e88cb43622195d40ddca736c2876de400e07bc31707/pact-python-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "88302eaf140c9d4f77703a99fe12a956", "sha256": "8c1bea8a46e74b4dc548927becfafea34d39ee346c51e7e146ca29f11f26410a" }, "downloads": -1, "filename": "pact-python-0.6.2.tar.gz", "has_sig": false, "md5_digest": "88302eaf140c9d4f77703a99fe12a956", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18940, "upload_time": "2017-06-27T13:44:46", "url": "https://files.pythonhosted.org/packages/d6/a4/b52cdbbae218973c6fa9000c3bd8bee0500d579d19ff0d203cb226022f85/pact-python-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "f17b8049efb4b9e0e8600884d2f9f060", "sha256": "a5fe7c01ca2732d53b1a51faf13016440012ec3983fff1fa38d941abd41abcf8" }, "downloads": -1, "filename": "pact-python-0.7.0.tar.gz", "has_sig": false, "md5_digest": "f17b8049efb4b9e0e8600884d2f9f060", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19974, "upload_time": "2017-07-16T14:08:56", "url": "https://files.pythonhosted.org/packages/7c/73/37204cb10878d5337cd34be11d122786b56c180247ced6a73eeeaf084bc6/pact-python-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "6c96492ffa8d9de9c50784277255420e", "sha256": "244bc14e47ce3e2a9bde90fc93793370c7e295d5937eb791f5c4e325366cddc2" }, "downloads": -1, "filename": "pact-python-0.8.0.tar.gz", "has_sig": false, "md5_digest": "6c96492ffa8d9de9c50784277255420e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22829, "upload_time": "2017-08-11T02:47:47", "url": "https://files.pythonhosted.org/packages/d3/b4/a8b231b36a72dadfd608ca317867e579446dbb8e79c4f1e08017d8a94299/pact-python-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "b0083e7904e94592f1ed2148687e39a1", "sha256": "c6f28ac4ac195483ce090e2086fca37f90b6da00bd9d0d9368e3e88e12a12b4e" }, "downloads": -1, "filename": "pact-python-0.9.0.tar.gz", "has_sig": false, "md5_digest": "b0083e7904e94592f1ed2148687e39a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25888, "upload_time": "2017-10-22T21:46:04", "url": "https://files.pythonhosted.org/packages/19/db/feb2cb819eb72f21dce620c129a4250bf470292f97628b7feb89e252b510/pact-python-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "012c4970a21812be08e12286dbea6cb5", "sha256": "fd48f55f3279e850882624bf37d606b1f4e1dc9fa078f6d3f9fe9697c962e417" }, "downloads": -1, "filename": "pact-python-0.19.0.tar.gz", "has_sig": false, "md5_digest": "012c4970a21812be08e12286dbea6cb5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25754, "upload_time": "2019-10-01T02:15:45", "url": "https://files.pythonhosted.org/packages/22/34/e8f6ce98a98b383683b2a91fb81ebb7f7a8f95352a410b97c16ab52c3e2e/pact-python-0.19.0.tar.gz" } ] }