{ "info": { "author": "Patrick Kelley", "author_email": "patrickbarrettkelley@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# PolicyUniverse\n\n[![Version](http://img.shields.io/pypi/v/policyuniverse.svg?style=flat)](https://pypi.python.org/pypi/policyuniverse/)\n\n[![Build Status](https://travis-ci.org/Netflix-Skunkworks/policyuniverse.svg?branch=master)](https://travis-ci.org/Netflix-Skunkworks/policyuniverse)\n\n[![Coverage Status](https://coveralls.io/repos/github/Netflix-Skunkworks/policyuniverse/badge.svg?branch=master&1)](https://coveralls.io/github/Netflix-Skunkworks/policyuniverse?branch=master)\n\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)\n\nThis package provides classes to parse AWS IAM and Resource Policies.\n\nAdditionally, this package can expand wildcards in AWS Policies using permissions obtained from the AWS Policy Generator.\n\nSee the [Service and Permissions data](policyuniverse/data.json).\n\n_This package can also minify an AWS policy to help you stay under policy size limits. Avoid doing this if possible, as it creates ugly policies._ \ud83d\udca9\n\n# Install:\n\n`pip install policyuniverse`\n\n# Usage:\n\n- [ARN class](#reading-arns)\n- [Policy class](#iam-and-resource-policies)\n- [Statement class](#statements)\n- [Action Categories](#action-categories)\n- [Expanding and Minification](#expanding-and-minification)\n\n## Reading ARNs\n\n```python\nfrom policyuniverse.arn import ARN\narn = ARN('arn:aws:iam::012345678910:role/SomeTestRoleForTesting')\nassert arn.error == False\nassert arn.tech == 'iam'\nassert arn.region == '' # IAM is universal/global\nassert arn.account_number == '012345678910'\nassert arn.name == 'role/SomeTestRoleForTesting'\nassert arn.partition == 'aws'\nassert arn.root == False # Not the root ARN\nassert arn.service == False # Not an AWS service like lambda.amazonaws.com\n\narn = ARN('012345678910')\nassert arn.account_number == '012345678910'\n\narn = ARN('lambda.amazonaws.com')\nassert arn.service == True\nassert arn.tech == 'lambda'\n```\n\n## IAM and Resource Policies\n\n### Policy with multiple statements\n```python\n# Two statements, both with conditions\npolicy05 = dict(\n Version='2010-08-14',\n Statement=[\n dict(\n Effect='Allow',\n Principal='arn:aws:iam::012345678910:root',\n Action=['s3:*'],\n Resource='*',\n Condition={\n 'IpAddress': {\n 'AWS:SourceIP': ['0.0.0.0/0']\n }}),\n dict(\n Effect='Allow',\n Principal='arn:aws:iam::*:role/Hello',\n Action=['ec2:*'],\n Resource='*',\n Condition={\n 'StringLike': {\n 'AWS:SourceOwner': '012345678910'\n }})\n ])\n\nfrom policyuniverse.policy import Policy\nfrom policyuniverse.statement import ConditionTuple, PrincipalTuple\n\npolicy = Policy(policy05)\nassert policy.whos_allowed() == set([\n PrincipalTuple(category='principal', value='arn:aws:iam::*:role/Hello'),\n PrincipalTuple(category='principal', value='arn:aws:iam::012345678910:root'),\n ConditionTuple(category='cidr', value='0.0.0.0/0'),\n ConditionTuple(category='account', value='012345678910')\n])\n\n# The given policy is not internet accessible.\n# The first statement is limited by the principal, and the condition is basically a no-op.\n# The second statement has a wildcard principal, but uses the condition to lock it down.\nassert policy.is_internet_accessible() == False\n```\n\n### Internet Accessible Policy:\n\n```python\n# An internet accessible policy:\npolicy01 = dict(\n Version='2012-10-08',\n Statement=dict(\n Effect='Allow',\n Principal='*',\n Action=['rds:*'],\n Resource='*',\n Condition={\n 'IpAddress': {\n 'AWS:SourceIP': ['0.0.0.0/0']\n }\n }))\n\npolicy = Policy(policy01)\nassert policy.is_internet_accessible() == True\nassert policy.internet_accessible_actions() == set(['rds:*'])\n```\n\n## Statements\n\nA policy is simply a collection of statements.\n\n```python\nstatement12 = dict(\n Effect='Allow',\n Principal='*',\n Action=['rds:*'],\n Resource='*',\n Condition={\n 'StringEquals': {\n 'AWS:SourceVPC': 'vpc-111111',\n 'AWS:Sourcevpce': 'vpce-111111',\n 'AWS:SourceOwner': '012345678910',\n 'AWS:SourceAccount': '012345678910'\n },\n 'StringLike': {\n 'AWS:userid': 'AROAI1111111111111111:*'\n },\n 'ARNLike': {\n 'AWS:SourceArn': 'arn:aws:iam::012345678910:role/Admin'\n },\n 'IpAddressIfExists': {\n 'AWS:SourceIP': [\n '123.45.67.89',\n '10.0.7.0/24',\n '172.16.0.0/16']\n }\n })\n\nfrom policyuniverse.statement import Statement\nfrom policyuniverse.statement import ConditionTuple, PrincipalTuple\n\nstatement = Statement(statement12)\nassert statement.effect == 'Allow'\nassert statement.actions == set(['rds:*'])\n\n# rds:* expands out to ~88 individual permissions\nassert len(statement.actions_expanded) == 88\n\nassert statement.uses_not_principal() == False\nassert statement.principals == set(['*'])\nassert statement.condition_arns == set(['arn:aws:iam::012345678910:role/Admin'])\nassert statement.condition_accounts == set(['012345678910'])\nassert statement.condition_userids == set(['AROAI1111111111111111:*'])\nassert statement.condition_cidrs == set(['10.0.7.0/24', '172.16.0.0/16', '123.45.67.89'])\nassert statement.condition_vpcs == set(['vpc-111111'])\nassert statement.condition_vpces == set(['vpce-111111'])\nassert statement.is_internet_accessible() == False\nassert statement.whos_allowed() == set([\n PrincipalTuple(category='principal', value='*'),\n ConditionTuple(category='cidr', value='123.45.67.89'),\n ConditionTuple(category='account', value='012345678910'),\n ConditionTuple(category='userid', value='AROAI1111111111111111:*'),\n ConditionTuple(category='vpc', value='vpc-111111'),\n ConditionTuple(category='arn', value='arn:aws:iam::012345678910:role/Admin'),\n ConditionTuple(category='cidr', value='172.16.0.0/16'),\n ConditionTuple(category='vpce', value='vpce-111111'),\n ConditionTuple(category='cidr', value='10.0.7.0/24')])\n\n```\n\n\n## Action Categories\n```python\npolicy = {\n \"Statement\": [{\n \"Action\": [\"s3:put*\", \"sqs:get*\", \"sns:*\"],\n \"Resource\": \"*\",\n \"Effect\": \"Allow\"\n }]\n }\n\nfrom policyuniverse.policy import Policy\np = Policy(policy)\nfor k, v in p.action_summary().items():\n print(k,v)\n>>> ('s3', set([u'Write', u'Permissions', u'Tagging']))\n>>> ('sqs', set([u'List']))\n>>> ('sns', set([u'List', u'Read', u'Write', u'Permissions']))\n```\nPossible categories are `Permissions`, `Write`, `Read`, `Tagging`, and `List`. This data can be used to summarize statements and policies and to look for sensitive permissions.\n\n## Expanding and Minification\n```python\nfrom policyuniverse.expander_minimizer import expand_policy\nfrom policyuniverse.expander_minimizer import minimize_policy\n\npolicy = {\n \"Statement\": [{\n \"Action\": [\"swf:res*\"],\n \"Resource\": \"*\",\n \"Effect\": \"Allow\"\n }]\n }\n\nexpanded_policy = expand_policy(policy=policy)\n>>> Start size: 131. End size: 286\nprint(expanded_policy == {\n \"Statement\": [{\n \"Action\": [\n \"swf:respondactivitytaskcanceled\",\n \"swf:respondactivitytaskcompleted\",\n \"swf:respondactivitytaskfailed\",\n \"swf:responddecisiontaskcompleted\"\n ],\n \"Resource\": \"*\",\n \"Effect\": \"Allow\"\n }]\n })\n>>> True\n\nminimized_policy = minimize_policy(policy=expanded_policy, minchars=3)\n>>> Skipping prefix r because length of 1\n>>> Skipping prefix re because length of 2\n>>> Skipping prefix r because length of 1\n>>> Skipping prefix re because length of 2\n>>> Skipping prefix r because length of 1\n>>> Skipping prefix re because length of 2\n>>> Skipping prefix r because length of 1\n>>> Skipping prefix re because length of 2\n>>> Start size: 286. End size: 131\n\nprint(minimized_policy == policy)\n>>> True\n```\n\n\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/Netflix-Skunkworks/policyuniverse", "keywords": "iam,arn,action_groups,condition,policy,statement,wildcard", "license": "", "maintainer": "", "maintainer_email": "", "name": "policyuniverse", "package_url": "https://pypi.org/project/policyuniverse/", "platform": "", "project_url": "https://pypi.org/project/policyuniverse/", "project_urls": { "Homepage": "https://github.com/Netflix-Skunkworks/policyuniverse" }, "release_url": "https://pypi.org/project/policyuniverse/1.3.2.1/", "requires_dist": [ "pre-commit ; extra == 'dev'", "black ; extra == 'dev'", "pytest ; extra == 'tests'", "coveralls ; extra == 'tests'" ], "requires_python": "", "summary": "Parse and Process AWS IAM Policies, Statements, ARNs, and wildcards.", "version": "1.3.2.1" }, "last_serial": 5920895, "releases": { "1.0.6.2": [ { "comment_text": "", "digests": { "md5": "5aa363541ac665279f297b43cac3c5b4", "sha256": "df59a685d1cd50aaa82b526f365f70c9e4664ec75e2cb8ce431e1c51012a04cd" }, "downloads": -1, "filename": "policyuniverse-1.0.6.2.tar.gz", "has_sig": false, "md5_digest": "5aa363541ac665279f297b43cac3c5b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23770, "upload_time": "2017-05-15T17:57:59", "url": "https://files.pythonhosted.org/packages/02/62/67a43dd56cb7e917a20ffca203cd16c42da5e3dd44106f3fc3e20774c127/policyuniverse-1.0.6.2.tar.gz" } ], "1.0.6.3": [ { "comment_text": "", "digests": { "md5": "c46be8b34cedd8b0617bfeadae8cef29", "sha256": "161d3d5fc3e20d72e3b6d7523f96ca00d4282730074c609e8181cbd9fa2c8d85" }, "downloads": -1, "filename": "policyuniverse-1.0.6.3.tar.gz", "has_sig": false, "md5_digest": "c46be8b34cedd8b0617bfeadae8cef29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26515, "upload_time": "2017-05-31T16:39:42", "url": "https://files.pythonhosted.org/packages/da/88/792ae83cd67c4910e524a13b9d1cf97948361e1b2ab69f23bd1693bf944c/policyuniverse-1.0.6.3.tar.gz" } ], "1.0.7.0": [ { "comment_text": "", "digests": { "md5": "2851fcc47830da86f6dbff083ebe50fe", "sha256": "e91a1ddef3437e5969d4fbc21eaa6805147cd3f61829252814a75e347de02d96" }, "downloads": -1, "filename": "policyuniverse-1.0.7.0.tar.gz", "has_sig": false, "md5_digest": "2851fcc47830da86f6dbff083ebe50fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31712, "upload_time": "2017-08-09T22:46:22", "url": "https://files.pythonhosted.org/packages/6d/65/594c471ee7d49fa4287a52f96b6034c136b1908a9ae2850ceb99746014ab/policyuniverse-1.0.7.0.tar.gz" } ], "1.0.7.1": [ { "comment_text": "", "digests": { "md5": "8300865393ddca1f00f489b48ba7943e", "sha256": "6702bb27397b17725601db172914dd732fe16a285c8213ae11fad4add859e2d2" }, "downloads": -1, "filename": "policyuniverse-1.0.7.1.tar.gz", "has_sig": false, "md5_digest": "8300865393ddca1f00f489b48ba7943e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31694, "upload_time": "2017-08-16T20:45:00", "url": "https://files.pythonhosted.org/packages/be/95/a0b44296ea500eb5321bd087fee450e0058c0fda6ded4b6f68a8bde5ff44/policyuniverse-1.0.7.1.tar.gz" } ], "1.0.7.2": [ { "comment_text": "", "digests": { "md5": "1f1e654330ba42aa27a41399e54bce00", "sha256": "aa2b28b24454fba3408c30fc472725cbdc78e23f60715bd245b34707ee29ccc1" }, "downloads": -1, "filename": "policyuniverse-1.0.7.2.tar.gz", "has_sig": false, "md5_digest": "1f1e654330ba42aa27a41399e54bce00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31704, "upload_time": "2017-08-23T02:04:37", "url": "https://files.pythonhosted.org/packages/17/cc/e61683b2da16498d528738a786cc1ca7cdd1cf40d6dab93499c2991aeee7/policyuniverse-1.0.7.2.tar.gz" } ], "1.0.7.3": [ { "comment_text": "", "digests": { "md5": "785de6ac2944fdfb1708aeba85c44d81", "sha256": "c8a8b922db75c2d3a37991bd8311b7bb6894a62c33a4f8b0d6fce0aae1c5ab9a" }, "downloads": -1, "filename": "policyuniverse-1.0.7.3.tar.gz", "has_sig": false, "md5_digest": "785de6ac2944fdfb1708aeba85c44d81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31724, "upload_time": "2017-08-23T02:23:06", "url": "https://files.pythonhosted.org/packages/0d/c8/44b3961355ddc55facfd3af81abe90ea8455c4f64ac7755e07759fc51f6f/policyuniverse-1.0.7.3.tar.gz" } ], "1.0.7.4": [ { "comment_text": "", "digests": { "md5": "b96486742680cf7ad1a9b73ef777ef43", "sha256": "deef42698c21703d4b9ba081b9e21b597c54629586c1acd8e099d9a59e7dc586" }, "downloads": -1, "filename": "policyuniverse-1.0.7.4.tar.gz", "has_sig": false, "md5_digest": "b96486742680cf7ad1a9b73ef777ef43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31720, "upload_time": "2017-08-23T03:08:36", "url": "https://files.pythonhosted.org/packages/9c/2a/99caf22bdb381dc07d3b0323b39132146210ac94b087999b5257448072ad/policyuniverse-1.0.7.4.tar.gz" } ], "1.0.7.5": [ { "comment_text": "", "digests": { "md5": "fe7c4bee8bc03103c9dcf1a33d2a4420", "sha256": "eedafb29bf6598d83436d94487df3386c73e4c840ce54008af7fc7fd2f35e62b" }, "downloads": -1, "filename": "policyuniverse-1.0.7.5.tar.gz", "has_sig": false, "md5_digest": "fe7c4bee8bc03103c9dcf1a33d2a4420", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31731, "upload_time": "2017-09-06T04:10:45", "url": "https://files.pythonhosted.org/packages/b8/62/8c54bec868b89e600f97c01cc27c3989e65f7c81b62321f41b69aa5c10d6/policyuniverse-1.0.7.5.tar.gz" } ], "1.0.7.6": [ { "comment_text": "", "digests": { "md5": "f82692adadb83e2bcf21da54e2083469", "sha256": "743c71d2bd47458fd7b89f3f1961c6709f6d07c9bfd854ff0dd2440857286213" }, "downloads": -1, "filename": "policyuniverse-1.0.7.6.tar.gz", "has_sig": false, "md5_digest": "f82692adadb83e2bcf21da54e2083469", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31735, "upload_time": "2017-09-08T19:06:49", "url": "https://files.pythonhosted.org/packages/fd/69/3d53199e34e4665d0ec6db0adab95659c9a01b5170798a82763acd289366/policyuniverse-1.0.7.6.tar.gz" } ], "1.1.0.0": [ { "comment_text": "", "digests": { "md5": "15ceaf8e946c966ce11832be7e8e4bf8", "sha256": "572f0b40ced5b9484a42030949f656c511ee13600ed97f3851467173b9309b8d" }, "downloads": -1, "filename": "policyuniverse-1.1.0.0.tar.gz", "has_sig": false, "md5_digest": "15ceaf8e946c966ce11832be7e8e4bf8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55665, "upload_time": "2017-11-01T18:59:19", "url": "https://files.pythonhosted.org/packages/59/b6/9b9e1c2b28ccc2e4c081edf11a523c4bf9580b9f4263a1169de126f46c6d/policyuniverse-1.1.0.0.tar.gz" } ], "1.1.0.1": [ { "comment_text": "", "digests": { "md5": "8691340634a69c708c1b3d5a48127b95", "sha256": "978c2ed2d2bac9ed6c663b170c8c1e7a47ef7fdd33af724ff4539087180d351d" }, "downloads": -1, "filename": "policyuniverse-1.1.0.1.tar.gz", "has_sig": false, "md5_digest": "8691340634a69c708c1b3d5a48127b95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55890, "upload_time": "2017-11-04T07:09:32", "url": "https://files.pythonhosted.org/packages/c9/f8/f24a3efe8762b1294cb262416dbe63d1f1fe8cb5839efc4324566390133a/policyuniverse-1.1.0.1.tar.gz" } ], "1.1.0.2": [ { "comment_text": "", "digests": { "md5": "1d8720589ad4320d8bcc539fa0ce9741", "sha256": "73ba4bf7587682f6f742605036b6b4dce498ea7c7b849bdf27367861296ac4c0" }, "downloads": -1, "filename": "policyuniverse-1.1.0.2.tar.gz", "has_sig": false, "md5_digest": "1d8720589ad4320d8bcc539fa0ce9741", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75159, "upload_time": "2018-12-27T00:25:15", "url": "https://files.pythonhosted.org/packages/7a/3f/525c2ffaf8cf5516833b89295e7c7456ac34b1266ac82ed2e189d22a5499/policyuniverse-1.1.0.2.tar.gz" } ], "1.2.0.1": [ { "comment_text": "", "digests": { "md5": "e3c0f767e91297009dd12a40eba350a4", "sha256": "83d69812ec2adb44db651f8544db85f42a2fd017f6da008d4daa8950027c869a" }, "downloads": -1, "filename": "policyuniverse-1.2.0.1.tar.gz", "has_sig": false, "md5_digest": "e3c0f767e91297009dd12a40eba350a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 170692, "upload_time": "2019-01-11T23:34:20", "url": "https://files.pythonhosted.org/packages/82/96/c7e495bc6afdcd1e9d399f00f4fd70739c7ceaa0b2ff5279b8d0f7fed83b/policyuniverse-1.2.0.1.tar.gz" } ], "1.3.0.1": [ { "comment_text": "", "digests": { "md5": "bfb5f35a88b1b0534b786816d7f67d23", "sha256": "1059af042cbeaf5749b57aa69c4fc3b90e3a2a3ef34b35073f9f77b562bd3331" }, "downloads": -1, "filename": "policyuniverse-1.3.0.1.tar.gz", "has_sig": false, "md5_digest": "bfb5f35a88b1b0534b786816d7f67d23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 183501, "upload_time": "2019-03-22T20:57:59", "url": "https://files.pythonhosted.org/packages/d8/37/ee7e4bb84c1bb22e1c71e8d3da54f3f4253089bfb84dd7b4ebe8f640dae8/policyuniverse-1.3.0.1.tar.gz" } ], "1.3.0.2": [ { "comment_text": "", "digests": { "md5": "9b356812ec31d1047b4fd1a0d84b3ce7", "sha256": "fa637310e1de37c325764fbf95c4e77304ce22b9e0693c18548721cf7e76b774" }, "downloads": -1, "filename": "policyuniverse-1.3.0.2.tar.gz", "has_sig": false, "md5_digest": "9b356812ec31d1047b4fd1a0d84b3ce7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194137, "upload_time": "2019-05-02T17:39:07", "url": "https://files.pythonhosted.org/packages/67/77/26fac1038f36ebff35520c3dafb40d5a3d3771112042059fc6bc6054ed6b/policyuniverse-1.3.0.2.tar.gz" } ], "1.3.1.1": [ { "comment_text": "", "digests": { "md5": "e5cc4866b2550572164bc8726cf61977", "sha256": "d63d82289334da3859563077c2f715c2581c95feb8053151936a0ede2fb9b3be" }, "downloads": -1, "filename": "policyuniverse-1.3.1.1.tar.gz", "has_sig": false, "md5_digest": "e5cc4866b2550572164bc8726cf61977", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194620, "upload_time": "2019-05-02T19:47:59", "url": "https://files.pythonhosted.org/packages/da/85/ab9aa8e630fd1ed52eb9e69d5286f14ec9e22edfb1dee1d5dff11cc1f70d/policyuniverse-1.3.1.1.tar.gz" } ], "1.3.1.2": [ { "comment_text": "", "digests": { "md5": "1e94c56c4405a526fae195fb69203854", "sha256": "f17a1503efe5660d52936bc8e4c5d4f35dc42b456584894e005e472eea4bac54" }, "downloads": -1, "filename": "policyuniverse-1.3.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1e94c56c4405a526fae195fb69203854", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 202926, "upload_time": "2019-05-28T21:15:19", "url": "https://files.pythonhosted.org/packages/63/bc/827b9b4ca3131b4b74e6ad8fb6d62a5348d0f45178c587a884ed0c494221/policyuniverse-1.3.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b02a817b335325a62d11a9cbec002b9", "sha256": "0e29ef626cf62266f2b6dc31fc5323024041eb8c1929e46ec8b1a9d61bc8d370" }, "downloads": -1, "filename": "policyuniverse-1.3.1.2.tar.gz", "has_sig": false, "md5_digest": "4b02a817b335325a62d11a9cbec002b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 197066, "upload_time": "2019-05-15T22:31:38", "url": "https://files.pythonhosted.org/packages/b4/7f/599a2d5b6b95f9669f715894c81c9e9c0254e58c62d135abf0768493f26d/policyuniverse-1.3.1.2.tar.gz" } ], "1.3.2.0": [ { "comment_text": "", "digests": { "md5": "8e8d7534075863fc98c95718df71c994", "sha256": "4ed9c8f9621a230bc45265927ca60f05f1d065fcf142683d28121b2f352cbf54" }, "downloads": -1, "filename": "policyuniverse-1.3.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8e8d7534075863fc98c95718df71c994", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 205422, "upload_time": "2019-05-29T03:09:43", "url": "https://files.pythonhosted.org/packages/c4/a7/a030cd93abdcf4df2154df948c2a68be8323c6594530beaf88028bd1600b/policyuniverse-1.3.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "54ae96d2457148702e6c5e6bf4c4c1ca", "sha256": "268aa7298a77fa75b73ca85ebd927df044427c91dbe6b5abec7b3a2de820e794" }, "downloads": -1, "filename": "policyuniverse-1.3.2.0.tar.gz", "has_sig": false, "md5_digest": "54ae96d2457148702e6c5e6bf4c4c1ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 200161, "upload_time": "2019-05-29T03:10:16", "url": "https://files.pythonhosted.org/packages/55/ef/9b4b6db9883642d3095a47fe10b5a78d84b38dd275fe4fd3ddfd22a372db/policyuniverse-1.3.2.0.tar.gz" } ], "1.3.2.1": [ { "comment_text": "", "digests": { "md5": "1afd8f1caa4455b34f03c6755e4166ef", "sha256": "cf2cbbc6089cf2f0770c806fd9c2542119a57a4b47a6ed6b2dca39fbb06803b7" }, "downloads": -1, "filename": "policyuniverse-1.3.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1afd8f1caa4455b34f03c6755e4166ef", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 224022, "upload_time": "2019-10-02T22:33:00", "url": "https://files.pythonhosted.org/packages/b6/42/8b3cab6b96612bf7e5b869255835bb238b813d1318700a04547f8e6de4ea/policyuniverse-1.3.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f94b290995dfbbaf8e19d0e12830ac64", "sha256": "e07b81c2cc040b7e7502ee3eceb72f4c449d325073f196e22894b7cc81bec1f5" }, "downloads": -1, "filename": "policyuniverse-1.3.2.1.tar.gz", "has_sig": false, "md5_digest": "f94b290995dfbbaf8e19d0e12830ac64", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 218262, "upload_time": "2019-10-02T22:33:02", "url": "https://files.pythonhosted.org/packages/a3/c1/144555fc075b9e6edab71a8be984f3067c7afa4c133c1484ef84c3c855fe/policyuniverse-1.3.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1afd8f1caa4455b34f03c6755e4166ef", "sha256": "cf2cbbc6089cf2f0770c806fd9c2542119a57a4b47a6ed6b2dca39fbb06803b7" }, "downloads": -1, "filename": "policyuniverse-1.3.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1afd8f1caa4455b34f03c6755e4166ef", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 224022, "upload_time": "2019-10-02T22:33:00", "url": "https://files.pythonhosted.org/packages/b6/42/8b3cab6b96612bf7e5b869255835bb238b813d1318700a04547f8e6de4ea/policyuniverse-1.3.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f94b290995dfbbaf8e19d0e12830ac64", "sha256": "e07b81c2cc040b7e7502ee3eceb72f4c449d325073f196e22894b7cc81bec1f5" }, "downloads": -1, "filename": "policyuniverse-1.3.2.1.tar.gz", "has_sig": false, "md5_digest": "f94b290995dfbbaf8e19d0e12830ac64", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 218262, "upload_time": "2019-10-02T22:33:02", "url": "https://files.pythonhosted.org/packages/a3/c1/144555fc075b9e6edab71a8be984f3067c7afa4c133c1484ef84c3c855fe/policyuniverse-1.3.2.1.tar.gz" } ] }